hduoj1052田忌赛马(贪心好题略难,思维,模拟)

题目链接: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 }

完。

原文地址:https://www.cnblogs.com/redblackk/p/9967523.html