hdu 1338 #greedy
来源:互联网 发布:类似魔镜的软件 编辑:程序博客网 时间:2024/05/20 18:52
/*Greedy ;//题意:有 m 个人,每人有 n 张卡片,每张卡片都有点数 1~m*n,并且每张卡片的点数都是不同的,总共进行 n 轮比赛,m 个人都选择自己的一张卡片来进行比较,点数最大的在该轮比赛中胜利。给出你所拥有的 n 张卡片的点数,求你在这场游戏中最少能赢多少轮比赛。思路:先求出其他人能赢的最多的比赛数 r(利用像田忌赛马一样的贪心策略,求自己最多输多少场,然后求自己能赢的最少比赛数 n-r。 别人一起看做反方,即让反方赢得最多 贪心策略: 如果自己最大的卡片大于其他人中最大的卡片,其他人最小的卡片与自己最大的卡片比较。 如果自己最大的卡片小于其他人中最大的卡片,就直接比较。*/#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int main(){ int cas = 0; int m,n; int ti,tj,pi,pj,vis[1001],t[51],p[1001]; while(scanf("%d%d",&m,&n) == 2 && m) { memset(vis,0,sizeof(vis)); for(ti = 0; ti < n; ++ti) { scanf("%d",t + ti); vis[t[ti]] = 1; } for(ti = n * m,pi = 0; ti > 0; ++pi) { while(vis[ti]) --ti; p[pi] = ti--; } sort(p,p + n); sort(t,t + n); int win = 0; int i; for(pi = ti = 0,pj = tj = n-1,i = 0; i < n; ++i) { if(p[pj] > t[tj]) { ++win; --pj; --tj; } else if(p[pj] < t[tj]) { --tj; pi += (m - 1); } } printf("Case %d: %d\n",++cas,n - win); } return 0;}