好坑的一道題,不過確實是貪心的一道好題,想了好久一直無法解決平局的情況。 參考了別人的思路,然后結合了自己的想法,總算是想出來了。
這題有些步驟是必須要執行的,有四個步驟
一、當期狀態田忌的最慢的馬比對手最慢的馬快,那么就直接比贏了這一盤,因為對手最慢的馬比田忌所有馬都慢,田忌為了后面的情況最優就用最小的代價來贏得這一個必勝的局。 二、當前狀態田忌最慢的馬比對手最慢的馬慢,說明田忌最慢的馬比對手所有的馬慢,對於這個必敗的情況田忌自然會用這匹馬去耗對手最快的馬,所以這局用最慢的馬去和對手最快的馬比。
三、同理,當前狀態田忌最快的馬比對手最快的馬快,則比這盤
四、同理,當前狀態田忌最快的馬比對手最快的馬慢,則用田忌最慢的馬來耗隊友最快的馬。 因為對手最快的馬怎么都要贏,所以要盡量減少損失。
也就是只要出現了這四種情況的其中一種,則必按上述步驟執行。但是還有一種情況,那就上述四種情況突然出現了兩種,那么到底先執行哪一種呢? 仔細想下就可以發現,先執行那一種情況最后的結果是相同的。
最后還可能會出現一種死局,那就是兩頭都相等的時候,這時候你可以假設一下用田忌最慢的馬去和對手最快的馬比,會出現兩種情況,一種是對手最快的馬比田忌最慢的馬快,但是田忌最快的馬也比對手最慢的馬快, 所以最壞情況田忌也可以使得除去最快最慢的馬剩下來的馬,與對手除去最快和最慢剩余下來的馬,繼續比較,這與兩邊都比成平局或者一邊平局所到達情況相同。 第二種,是當前狀態所有的馬速度相同,這樣任何一種策略得出的結果都是相同的。
按照這種思路,這題就可以解了。
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <string> #include <queue> #include <stdlib.h> using namespace std; #define N 1100 int ga[N],gt[N]; int main() { int n; while(scanf("%d",&n)&&n) { for(int i=0;i<n;i++) scanf("%d",gt+i); for(int i=0;i<n;i++) scanf("%d",ga+i); sort(ga,ga+n); sort(gt,gt+n); int ans=0; int ab,ad,tb,td; ab=0,ad=n-1; tb=0,td=n-1; int sign=0; while(1) { if(sign==0) { if(gt[tb]>ga[ab]) { ans++; tb++; ab++; if(tb>td) break; } else if(gt[tb]<ga[ab]) { if(ga[ad]>gt[tb]) ans--; tb++; ad--; if(tb>td) break; } else { if(ga[ad]==gt[td]) { if(ga[ad]>gt[tb]) ans--; tb++;ad--; if(tb>td) break; } else { sign=1; //否者交換方式 } } } else { if(gt[td]>ga[ad]) { ans++; td--;ad--; if(tb>td) break; } else if(gt[td]<ga[ad]) { ans--; tb++; ad--; if(tb>td) break; } else { if(ga[ab]==gt[tb]) { if(ga[ad]>gt[tb]) ans--; tb++; ad--; if(tb>td) break; } else { sign=0; } } } } printf("%d\n",ans*200); } return 0; }
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。