1059: 田忌赛马
时间限制: 1 Sec 内存限制: 128 MB提交: 1303 解决: 347
[ 提交][ 状态][ 讨论版]
题目描述
田忌和齐王赛马,两人各出n匹马,赢一场比赛得200两银子,输了赔200银子,平局不赔不赚.已知两人每匹马的速度,问田忌最多能赢多少银子.
输入
多组测试数据,
每组数据的第一行是一个整数n。 (1<=n<=1000)
第二行包括n个整数既田忌每匹马的速度.
第三行包括n个整数既齐王每匹马的速度.
每匹马的速度不超过1000.
输出
对于每组数据输出一行有一个整数代表田忌最多能赢多少银子
样例输入
样例输出
大一进来不久的时候第一次做了这个题目,结果给这个题目摆了一道,研究了半天没懂,后来就对这个贪心算法心生恐惧。
现在准备正式攻略一下。
先转载一段贪心算法的定义和核心:点击打开链接
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
解题的一般步骤是:
1.建立数学模型来描述问题;
2.把求解的问题分成若干个子问题;
3.对每一子问题求解,得到子问题的局部最优解;
4.把子问题的局部最优解合成原来问题的一个解。
说白了就是在把问题分开每一步都取最优解,这就是贪心。这应该就是要求他每一步都不会影响后面的问题以及整体。也就是和全局最优解相对的局部最优解。这也就是贪心算法的限制条件了。
第一次看到贪心算法 感觉就是很普通很简单的算法 完全是一种理论 但是因为它没有固定的模板 想去熟练掌握还真的很麻烦。
回到这个题目吧,用贪心算法,首先先用sort函数把两队的马的速度进行排序,之后列一个具体的思路:
1.首先用最慢的比,如果田忌最慢的马比齐王最慢的马快,那么赢一场。
2.如果田忌最快的马比齐王最快的马快,也赢一场。
3.如果田忌最慢的马比齐王最慢的马慢或者最快的比最快的慢,那么田忌最慢的干齐王最快的,
4,如果田忌最慢的马比齐王最慢的马慢或者最快的比最快的慢且田忌最快的和齐王最慢的相等,齐王最快和田忌最慢比
贴代码:
#include<bits/stdc++.h>
using namespace std;
int i,j,la,lb,n,a[1010],b[1010],sum;
bool cmp(int a,int b){
return a>b;
}
int main(){
while(cin>>n){
for(i=0;i<n;i++)cin>>a[i];
for(i=0;i<n;i++)cin>>b[i];
sort(a,a+n,cmp);
sort(b,b+n,cmp);
for(i=j=sum=0,la=lb=n-1;i<=la;){
if(a[la]>b[lb])sum++,la--,lb--;
else if(a[i]>b[j])sum++,i++,j++;
else {
if(a[la]!=b[j])sum--;
la--,j++;
}
}
cout<<sum*200<<endl;
}
return 0;
}