POJ1323 ( 贪心)
算法分析:
1. 将自已的牌a[]从大到小排,要求至少能胜多少round,其实是求最多输了多少轮,也就是求对手最多赢多少轮;
2. 将对手的牌b[]从大到小排,如果自已的牌a[i]>b[j],对手可以用手头上最小的牌比较,再进行下一轮,如果a[i]<b[j],则算对手胜一轮!
代码如下:
View Code
1 #include<iostream>
2 #include<algorithm>
3 using namespace std;
4
5 bool cmp(int x,int y)
6 {
7 return x>y;
8 }
9
10 int main()
11 {
12 int m,n,i,a[55],b[1005],p=0;
13 while(cin>>m>>n)
14 {
15 p++;
16 if(m==0&&n==0) break;
17 for(i=0;i<n;i++)
18 cin>>a[i];
19 sort(a,a+n,cmp);
20 int j=0,k=0,lose=0;
21 for(i=n*m;i>0;i--)
22 if(i!=a[k])
23 b[j++]=i;
24 else k++;
25 j=0;
26 k=0;
27 for(i=0;i<n;i++)
28 if(a[k]>b[j]) k++;
29 else
30 {
31 lose++;
32 k++;
33 j++;
34 }
35 cout<<"Case "<<p<<": "<<n-lose<<endl;
36 }
37 return 0;
38 }
2 #include<algorithm>
3 using namespace std;
4
5 bool cmp(int x,int y)
6 {
7 return x>y;
8 }
9
10 int main()
11 {
12 int m,n,i,a[55],b[1005],p=0;
13 while(cin>>m>>n)
14 {
15 p++;
16 if(m==0&&n==0) break;
17 for(i=0;i<n;i++)
18 cin>>a[i];
19 sort(a,a+n,cmp);
20 int j=0,k=0,lose=0;
21 for(i=n*m;i>0;i--)
22 if(i!=a[k])
23 b[j++]=i;
24 else k++;
25 j=0;
26 k=0;
27 for(i=0;i<n;i++)
28 if(a[k]>b[j]) k++;
29 else
30 {
31 lose++;
32 k++;
33 j++;
34 }
35 cout<<"Case "<<p<<": "<<n-lose<<endl;
36 }
37 return 0;
38 }