题目链接:
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33702
贪心:
1,如果田忌的最快马快于齐王的最快马,则两者比。
(因为若是田忌的别的马很可能就赢不了了,所以两者比)
2,如果田忌的最快马慢于齐王的最快马,则用田忌的最慢马和齐王的最快马比。
(由于所有的马都赢不了齐王的最快马,所以用损失最小的,拿最慢的和他比)
3,若相等,则比较田忌的最慢马和齐王的最慢马
3.1,若田忌最慢马快于齐王最慢马,两者比。
(田忌的最慢马既然能赢一个就赢呗,而且齐王的最慢马肯定也得有个和他比,所以选最小的比他快得。)
3.2,其他,则拿田忌的最慢马和齐王的最快马比。
(反正所有的马都比田忌的最慢马快了,所以这匹马必输,选贡献最大的,干掉齐王的最快马)
贪心策略2:
一、如果a的最慢速度大于b的最慢,则直接a的最慢与b的最慢比赛,赢一场;
二、如果a的最慢速度小于b的最慢,则用a的最慢浪费b的最快,输一场;
三、如果a的最慢速度等于b的最慢,则:
1.如果a的最快速度大于b的最快,则直接a的最快与b的最快进行比赛,赢一场;
2.如果a的最快速度小于b的最快,则用a的最慢浪费b的最快,输一场;
3.如果a的最快速度等于b的最快,即a与b的最慢与最快分别相等,则:
a.如果a的最慢速度小于b的最快,则用a的最慢浪费b的最快,输一场;
b.如果a的最慢速度等于b的最快,即a的最慢、a的最快、b的最慢、b的最快相等,说明剩余未比赛的马速度全部相等,直接结束比赛。
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn = 1005; 5 int tian[maxn], king[maxn], n; 6 7 int main(){ 8 while(~scanf("%d", &n)){ 9 if(!n) break; 10 for(int i = 0; i < n; ++i) scanf("%d", &tian[i]); 11 for(int i = 0; i < n; ++i) scanf("%d", &king[i]); 12 sort(tian, tian + n); 13 sort(king, king + n); 14 15 int thead = 0, khead = 0; 16 int ttail = n-1, ktail = n-1; 17 int win = 0; 18 19 while(n--){ 20 if(tian[ttail] > king[ktail]){ //如果田忌的最快马快于齐王的最快马,则两者比。 21 ttail--; 22 ktail--; 23 win++; 24 } 25 else if(tian[ttail] < king[ktail]){ //如果田忌的最快马慢于齐王的最快马,则用田忌的最慢马和齐王的最快马比。 26 thead++; 27 ktail--; 28 win--; 29 } 30 else{ //若相等,则比较田忌的最慢马和齐王的最慢马 31 if(tian[thead] > king[khead]){ //若田忌最慢马快于齐王最慢马,两者比。 32 thead++; 33 khead++; 34 win++; 35 } 36 else{ //其他,则拿田忌的最慢马和齐王的最快马比。 37 if(tian[thead] < king[ktail]) win--; 38 thead++; 39 ktail--; 40 } 41 } 42 } 43 44 printf("%d ", win*200); 45 } 46 47 return 0; 48 }
贪心策略2代码:
1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 const int MAXN=1010; 7 int a[MAXN],b[MAXN]; 8 int main(){ 9 int n; 10 while(scanf("%d",&n)==1&&n){ 11 for(int i=0;i<n;i++)scanf("%d",&a[i]); 12 for(int i=0;i<n;i++)scanf("%d",&b[i]); 13 sort(a,a+n); 14 sort(b,b+n); 15 int al=0,ah=n-1; 16 int bl=0,bh=n-1; 17 int ans=0; 18 while(al<=ah&&bl<=bh){ 19 if(a[al]>b[bl]){ 20 ans+=200; 21 al++;bl++; 22 } 23 else if(a[al]<b[bl]){ 24 ans-=200; 25 al++;bh--; 26 } 27 else{ 28 if(a[ah]>b[bh]){ 29 ans+=200; 30 ah--;bh--; 31 } 32 else if(a[ah]<b[bh]){ 33 ans-=200; 34 al++;bh--; 35 } 36 else{ 37 if(a[al]<b[bh]){ 38 ans-=200; 39 al++;bh--; 40 } 41 else if(a[al]==b[bh]){//所有的都一样了 42 break; 43 } 44 } 45 } 46 } 47 printf("%d ", ans); 48 } 49 return 0; 50 }