3266--貪心演算法--田忌賽馬
阿新 • • 發佈:2019-02-16
題意:
田忌賽馬的故事,如果田忌贏了一把就贏200如果輸了就-200,給出馬匹的速度,求田忌的最大收益。
思路:
分三種大情況,
1.如果田忌的最快的馬能贏國王最快的馬那就比,
2.如果不能贏那就用田忌最慢的馬去消耗國王最強的馬,
3.最後一種大情況比較複雜,單獨展開來說:如果田忌最快的與國王最快的馬速度相等,別急著比快馬。先比較田忌最慢的馬和國王最慢的馬,如果田忌慢馬贏的了國王慢馬,那就比,如果贏不了那就用這匹慢馬去消耗國王的快馬,這樣田忌的快馬就會保留下來。大概就是這樣,一直比下去。還有一些細節講不完,附上幾組坑點,如果wa了,自己測試一下。
2 2 3 4
1 2 3 4
--------輸出400
1 1 1 1
1 1 1 1
---------輸出0
1 3 4 6
1 4 5 6
---------輸出200
特別鳴謝jacknazi提供的樣例。
#include <iostream> #include<cstring> #include<algorithm> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int tmax,tmin,gmax,gmin; int tian[1005],guo[1005]; int main(int argc, char** argv) { int n; while(cin>>n&&n){ int win=0; for(int i=0;i<n;i++) cin>>tian[i]; sort(tian,tian+n); for(int i=0;i<n;i++) cin>>guo[i]; sort(guo,guo+n); gmax=tmax=n-1; tmin=gmin=0; while(gmax>=gmin){ if(tian[tmax]>guo[gmax]){ tmax--; gmax--; win++; } else if(tian[tmax]<guo[gmax]){ tmin++; gmax--; win--; } else{ if(tian[tmin]>guo[gmin]){ //tmax--;gmax--; tmin++;gmin++; win++; } else if(tian[tmin]==guo[gmin]){ if(guo[gmax]==tian[tmin]){ gmax--;tmin++; } else{ gmax--;tmin++; win--; } } else{ gmax--;tmin++; win--; } } } printf("%d\n",win*200); } return 0; }