- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我又一次被 sopj 问题困住了 pilots
问题陈述是..
查理收购了航空运输公司,为了继续经营下去,他需要千方百计降低开支。他的公司有 N 名飞行员(N 为偶数),需要培养 N/2 名机组人员。机组人员由两名飞行员组成 - 一名机长和他的助手。船长必须比他的助手年长。每个飞行员都有一份契约(Contract),授予他两种可能的薪水——一种是机长,另一种是助理。同一个飞行员,机长的薪水比副手的多。但是,助理的薪水可能比他的队长高。编写一个程序,计算如果查理决定花一些时间对飞行员进行最优(即最便宜)的机组安排,他需要为飞行员的薪水支付的最低金额。
输入
第一行输入整数N,2≤N≤10000,N为偶数,查理公司的飞行员人数。接下来的 N 行输入包含飞行员的薪水。这些行按飞行员的年龄排序,最年轻的飞行员的薪水排在第一位。这 N 行中的每一行包含两个由空格字符分隔的整数,X i Y,1 ≤ Y < X ≤ 100,000,船长的薪水 (X) 和助理的薪水 (Y)。
输出
输出的第一行也是唯一一行应该包含 Charlie 需要为飞行员的工资支付的最少金额。
示例
输入
4
5000 3000
6000 2000
8000 1000
9000 6000
输出19000
输入
6
10000 7000
9000 3000
6000 4000
5000 1000
9000 3000
8000 6000
输出32000
现在我正在使用一个贪婪的方法,因为很明显第一个飞行员应该是助理,然后我检查是否可以通过让飞行员担任机长来省钱,如果是的话,那么我会让他成为机长,其他人则是助理.
它在大多数情况下都能完美工作,但我得到了一个错误的 awnser。
我的代码是..
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define FOR(i,n) for(int i=0;i<n;i++)
int main()
{
int n;
//freopen("input.txt","r",stdin);
cin>>n;
vector<pair<pii,int> > data;
FOR(i,n)
{
int csal,asal;
cin>>csal>>asal;
int diff=csal-asal;
data.pb(mp(mp(csal,asal),diff));
}
int ccount=0,acount=0,sal=0;
FOR(i,n)
{
if(acount<n/2)
{
int flag=1;
for(int j=i+1;j<=i+(acount-ccount);j++)
{
if(data[i].se<=data[j].se)
{
//cout<<j<<" ";
flag=0;
break;
}
}
if(flag)
{
sal+=data[i].fi.se;
acount++;
}
else
{
sal+=data[i].fi.fi;
ccount++;
}
}
else
{
sal+=data[i].fi.fi;
ccount++;
}
//cout<<sal<<" "<<i<<"\n";
}
cout<<sal<<"\n";
return 0;
}
请帮我解决这个问题..
最佳答案
这是一个运行时间为 O(N log N) 的解决方案。它使用贪心算法,但它与你的不同。
1) 假设 delta[i] = X[i] - Y[i]
。
2) 现在让我们处理按 delta[i]
降序排列的飞行员。我们将假设所有飞行员最初都被赋予机长职位。
3)如果可能的话,每个飞行员都应该重新分配到助理职位。
就是这样。我声称这个算法总是给出正确的结果。
证明:
1)当飞行员不能担任助理工作时?
i) 当他右边(按年龄)没有“空闲”队长时(即如果他右边的队长人数大于或等于助手人数)。为什么会这样?除非他右边有“太多”助手。让我们假设我们决定修复它。这将需要将一名助手更换为船长。但如果飞行员是助理,则他在现任飞行员之前得到处理。这意味着他的 delta
更大(回想一下我们按排序顺序迭代它们)。再观察一下:一个助手只能挡住一个船长(因为船员只有一个船长)。这两个观察表明,在无法使当前飞行员成为助手的情况下进行某些更改只会使答案变得更糟。
ii) 当他被他左边(按年龄计算)的助手接任为队长时。要修复它,有必要让那个人再次成为船长,就像在 i) 中一样。这只会使答案变得更糟(证明与上述情况相同)。
2)利用数学归纳法和以上两个观察,可以严格证明该算法是正确的。
3)该算法总是会产生恰好 N/2
个助手,因为它会尽可能让飞行员成为助手,并且恰好有 N/2
种可能性。
剩下的唯一问题是:如何检查是否可以让当前飞行员成为助手?
这是一个快速的方法:让我们为每个飞行员分配 1
,如果他是机长,否则分配 -1
。我们来看看这个-1
和1
的数组,按照飞行员的年龄排序。我声明,如果有后缀为负数,则配置无效。否则,它是有效的(这个陈述并不难证明,但我不会在这里张贴证据或者我的答案中有太多证据)。所以我们需要维护两个操作:将 -1
更改为 1
(反之亦然)并判断是否存在与负和的后缀。这是一个标准问题,可以用线段树解决(可以在每个节点中存储总和和最小后缀和,更新很容易,因为一次只改变一个元素的值(即叶子中的一个值)).
复杂度为 O(N log N)
因为我们需要对数组进行排序,并且在迭代过程中,每一步最多对线段树执行 3 次查询(并且每个查询需要 O(log N)
时间)。
关于algorithm - 寻找产生最低工资的安排,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25369411/
我们有一个接口服务为下游的系统提供数据服务,本来好好的大家都愉快地传递JSON,非常和谐。可最近有个新需求去对接一个很老的系统,这倒是不算啥,可这个老系统数据不是以JSON传递的而是以XML传递
我想完成这样的事情: results = [] for i in range(N): data = generate_data_slowly() res = tasks.process
如何安排 SSIS 每天在给定时间从文件中自动执行包? 最佳答案 你有几个选择,但我会给你一些让你快速启动和运行的东西...... 打开 SQL Server Management Studio 并连
我们有两个服务器 Azure 配置,运行由 Umbraco 提供支持的网站。当我们需要向Azure服务器添加新域时,我们修改配置文件,然后依次重新启动每台服务器。 理论上,因为我们永远不会同时重新启动
我给出了一个创建电子邮件 C# 控制台应用程序的任务,该应用程序的目标是批量运行。我对 C# 领域非常陌生,因此我不知道我的方向。此 C# 控制台应用程序将部署在服务器上,并期望根据服务器时间在特定时
我有一个控制台应用程序,运行时会执行一些操作,并使用docker生成它的镜像。现在,我想将其部署到Kubernetes并每小时运行一次,是否有可能在K8中完成? 我已经阅读了有关Cron作业的信息,但
这是我的 CronJob 规范的一部分: kind: CronJob spec: schedule: #{service.schedule} 对于特定环境,设置了 cron 作业,但我从不希望
我的任务是创建一个应用程序,该应用程序将每 (n) 分钟向选定的收件人发送一封电子邮件。它所在的应用程序的结构方式是通过回调 .main(args) 来重置自身。每当需要的时候。我的问题是,当我调用.
安排 Airflow Dag 使其仅在工作日运行的正确方法是什么?我已经尝试在 start_date 和 schedule_interval 表达式中都包含小时偏移量,但它仍然没有在所需的时间开始。
我有许多测试都安排了一些 TestFixtures,我发现我正在复制该安排代码很多。每个测试的前几行几乎相同。 有没有一种方法可以在所有测试中声明一个共享的 TestFixture,同时仍然在每个测试
我有一个问题,我正在创建一个应用程序,我想在系统与 azan 时间匹配时在后台播放 azan 文件,无论用户正在使用应用程序的任何屏幕,azan 都应该开始播放。 我在 Azan.java 中创建了一
在我没有重启我的手机之前一直在 toast ,但是在重启之后 broadcastreceiver2 没有收到并且没有任何反应。 我关注了http://stacktips.com/tutorials/a
自动将一个数据库表的表数据复制到另一个数据库表;当表格更新或按某个特定时间间隔更新时,安排 数据库MySQL;语言 PHP 我有两个数据库; A和B 数据库 A 包含一个表 USERS 我想将USER
我的 Android 应用程序将定期轮询服务器以检查数据。我希望无论用户与应用程序交互如何进行此轮询,类似于(在概念上)Gmail 和 Google Reader 应用程序如何在后台同步数据。安装应用
我可以将android中的警报管理器(.set()方法)安排到当前时间一个月后的时间吗它会活那么久吗?操作系统对此 alarmManager 有何影响? 最佳答案 用户重启手机时的提示。您可以使用以下
安排 AsyncTask 每分钟运行一次的最佳做法是什么(请注意,在 AsyncTask 完成后我应该能够更新 UI)。 我不打算使用服务,因为这些任务应该只在应用处于 Activity 状态时运行。
我在排列从 php 中的 while 循环返回的数据时遇到问题。 基本上,我正在尝试从数据库返回工作的时间段计划,问题是我似乎在所有时间段中得到相同的结果,或者在一个时间段中的所有客户端得到相同的结果
我想创建一个仅在周六和周四运行的 mysql 事件。 是否可以定义事件本身的日期? 我有一个想法,每天运行调度程序,如果是星期四或星期六,则该过程将继续,否则它将退出调度程序而不执行任何操作。 最佳答
如何使用 MySQL 调度程序安排查询运行(如果这是最好的方法)?我按照 link here 中的说明进行操作但我有点迷路了。 我想在我们拥有的特定数据库上每 30 分钟运行一次以下查询。 u
我想在使用事件轮换我的日志后读取我的表日志,我希望我的事件在我选择的一周中的任何一天运行。 经过一番研究,我想到了这个 CREATE EVENT read_rotated_logs ON SCHEDU
我是一名优秀的程序员,十分优秀!