http://acm.hdu.edu.cn/showproblem.php?pid=1052
题目大意:田忌赛马问题
(这类要从数组头尾比较的问题,一般设置两个变量记录头尾下标的变化)
分析:
1、如果田忌最快的马比齐王最快的马快,则比之
2、如果田忌最快的马比齐王最快的马慢,则用田最慢的马跟齐最快的马比 //这是贪心的第一步
3、如果田忌最快的马的速度与齐威王最快的马速度相等
3.1、如果田忌最慢的比齐威王最慢的快,则比之 //这是贪心的第二步
//这里我一直写错,就是如果田忌最慢的不比齐威王最慢的快,那么我们要额外去判断一下王的最快的马和田忌最慢马的情况。为什么呢?因为,当两最慢马相等时,田忌最慢马耶可能和王最快马是一样的,那么就不会有损失。
3.2、如果田忌最慢的比齐威王最慢的慢,田忌慢VS齐王快
3.3、田忌最慢的与齐威王最慢的相等,田忌慢VS齐王快.
#include<iostream>
using namespace std;
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
int main()
{
int n,sum,j1,k1,j2,k2,m;;
int a[1005],b[1005];
while(cin>>n&&n){
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n,greater<int>());
for(int i=0;i<n;i++)
cin>>b[i];
sort(b,b+n,greater<int>());
m=sum=0;
j1=k1=0; //每个数组设置头尾两个下标
j2=k2=n-1;
while(1){
if(m==n) break;
if(a[j1]>b[k1]){
sum+=200;
m++;
j1++;k1++;
continue;
}
if(a[j1]<b[k1]){
sum-=200;
m++;
k1++;j2--;
continue;
}
if(a[j1]==b[k1]){
if(a[j2]>b[k2]){
sum+=200;
m++;
j2--;k2--;
continue;
}
if(b[k1]>a[j2]){ //注意这里if里面的比较
sum-=200;
m++;
j2--;k1++;
}else{
m++;
j2--;k1++;
}
continue;
}
}
printf("%d\n",sum);
}
return 0;
}