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;}


原创粉丝点击