栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 1818 ATP

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 1818 ATP

#include <stdio.h>#include <cstring>#define max(a,b) ((a)>(b)?(a):(b))int n, x, k, queue[5010], add; char elio[5010];int vali (int person){    int i, j, kase, tail, t;    memset(elio, 0, sizeof(elio));    //可以认为:elio[i]=j 表示i最后一次胜利是在倒数第j轮    elio[person] = 1; tail = person;    add = 0; queue[add++] = person;    //总共x轮 (这里kase=i实际上表示倒数第i轮比赛)    for (kase = 1; kase <= x; kase++)        {        t = add;        for (i = 0; i < t; i++)   { for (j = max(1, queue[i] - k); j <= tail; j++) {     if (elio[j] == 0)     {        elio[j] = kase + 1;         queue[add++] = j;   //放入数组,因为下一轮循环(即上一轮比赛)需要为其分配对手        break;     } }        }    }    for (i = 1; i <= tail; i++)        if (elio[i] == 0) return 0;   //之前还有人没分配到,即没有合法方案    return 1;}int main (){    int st, ed, mid, i;    scanf("%d %d", &n, &k);    for (x = 0, i = 1; i < n; x++, i *= 2);    st = 1, ed = n;    if (vali(ed)) st = ed;    else while (ed - st > 1)    //二分    {         mid = (st + ed) >> 1;         if (vali(mid)) st = mid;         else ed = mid;    }    printf("%dn", st);    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/374302.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号