题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1052
想了好长时间终于搞明白了,从大到小一一匹配,==时候到底打还是用最慢消耗情况太多,最麻烦要分清况考虑!
1.>,最快打最快,直接打加分(不错位,+200)
2.<最慢耗最快,减分(错位,-200)
3.相等时3种情况
3.1,1个相等1个>时,最慢>最慢可加分(不错位,+200)
//4 5
//3 5
3.2.1,1个相等1个<=时,用最慢耗最快(错位,-200)
//2 5 //3 5
//3 5 //3 5
3.2.2,1个相等1个<=时,用最慢耗最快(错位,但不减分!)(最关键!!麻烦)
//5 5
//5 5
终于A了我的天哪!
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 const int maxn=1e6+5; 5 int a[maxn],b[maxn]; 6 7 int main() 8 { 9 ios::sync_with_stdio(false); cin.tie(0); 10 11 int n; 12 while(cin>>n && n) 13 { 14 for(int i=1;i<=n;i++) cin>>a[i]; 15 for(int i=1;i<=n;i++) cin>>b[i]; 16 17 sort(a+1,a+1+n); 18 sort(b+1,b+1+n); 19 int imin=1,jmin=1; 20 int imax=n,jmax=n; 21 int s=0; 22 while(imin<=imax && jmin<=jmax) 23 { 24 if(a[imax]>b[jmax])//>用最快直接打 25 { 26 s+=200; 27 imax--; 28 jmax--; 29 } 30 else if(a[imax]<b[jmax])//<用最慢直接打 31 { 32 s-=200; 33 imin++; 34 jmax--; 35 } 36 else//==时候最麻烦,分情况讨论 37 { 38 if(a[imin]>b[jmin])//最慢>最慢可加分,直接打 39 { 40 s+=200; 41 imin++; 42 jmin++; 43 } 44 else//<和==情况一样,用最慢去耗它的最快(但是去耗的时候减不减分还要分情况!) 45 { 46 if(a[imin]<b[jmax]) s-=200;//这句很关键,相等时特殊情况 47 imin++; //这种最最麻烦最最难想! 48 jmax--; 49 } 50 } 51 } 52 cout<<s<<endl; 53 } 54 55 return 0; 56 }
完。