poj 2287貪欲(田忌競馬)
1821 ワード
标题:田忌競馬.馬ごとに能力値を与えて、1試合に勝って200元勝って、1試合に負けて200元負けて、引き分けのお金の数は変わらない.問収益が最も大きい.
考え方(http://blog.csdn.net/zhang20072844/article/details/8126344):貪欲な策略:1、田忌の最速馬が斉王の最速馬より速いなら、両者を比べる.(田忌の他の馬では勝てない可能性が高いので、両者を比べます)2、田忌の最速馬が斉王の最速馬より遅い場合は、田忌の最速馬と斉王の最速馬で比べます.(すべての馬が斉王の最速馬に勝てないため、損失が最も小さいものを使って、最も遅いものを彼と比べる)3、等しければ、田忌の最も遅い馬と斉王の最も遅い馬3.1を比較し、若田忌の最も遅い馬は斉王の最も遅い馬より速く、両者を比べる.△田忌の一番遅い馬は一人で勝つことができる以上、斉王の一番遅い馬も彼と比べなければならないに違いない.だから、一番小さい馬を選んで彼より速い.(どうせすべての馬は田忌の一番遅い馬より速いから、この馬は必ず負ける(この場所はまだよく分からない)、貢献が一番大きいのを選んで、斉王の一番速い馬を殺す)
考え方(http://blog.csdn.net/zhang20072844/article/details/8126344):貪欲な策略:1、田忌の最速馬が斉王の最速馬より速いなら、両者を比べる.(田忌の他の馬では勝てない可能性が高いので、両者を比べます)2、田忌の最速馬が斉王の最速馬より遅い場合は、田忌の最速馬と斉王の最速馬で比べます.(すべての馬が斉王の最速馬に勝てないため、損失が最も小さいものを使って、最も遅いものを彼と比べる)3、等しければ、田忌の最も遅い馬と斉王の最も遅い馬3.1を比較し、若田忌の最も遅い馬は斉王の最も遅い馬より速く、両者を比べる.△田忌の一番遅い馬は一人で勝つことができる以上、斉王の一番遅い馬も彼と比べなければならないに違いない.だから、一番小さい馬を選んで彼より速い.(どうせすべての馬は田忌の一番遅い馬より速いから、この馬は必ず負ける(この場所はまだよく分からない)、貢献が一番大きいのを選んで、斉王の一番速い馬を殺す)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 1005
int t[N],k[N];
int n;
int cmp(const void* a,const void* b){
return (*(int*)a) - (*(int*)b);
}
int main(){
while(scanf("%d",&n) && n){
int res=0,i,ti,ki,tj,kj;
for(i = 1;i<=n;i++)
scanf("%d",&t[i]);
for(i = 1;i<=n;i++)
scanf("%d",&k[i]);
qsort(t+1,n,sizeof(int),cmp);
qsort(k+1,n,sizeof(int),cmp);
ti = ki = 1;//t ,k ;ij
tj = kj = n;
while(ti!=tj){
if(t[ti] < k[ki] || t[tj] < k[kj]){
ti++;
kj--;
res -= 200;
}else if(t[tj] > k[kj]){
tj--;
kj--;
res += 200;
}else if(k[ki] < t[ti]){
ti++;
ki++;
res += 200;
}else{
if(t[ti] < k[kj])
res -= 200;
ti++;
kj--;
}
}
if(t[ti] < k[ki])
res -= 200;
else if(t[ti] > k[ki])
res += 200;
printf("%d
",res);
}
return 0;
}