RCC Warmup

来源:互联网 发布:java中线程安全的类 编辑:程序博客网 时间:2024/05/20 20:18

http://codeforces.com/contest/417/problem/A

题意:淘汰赛分为两种 main 和 additional。一次main elimination需要c个问题,能从中取出前n个人参加finals,一次additional elimination需要d个问题,能从中取出一个人参加finals。此时需要至少选出n*m个人参加finals,已知已经有k个人确定参加finals而不需要参加淘汰赛。问最少需要准备几道问题可以选出参加finals的人数。


#include <stdio.h>#include <string.h>#include <algorithm>#define LL long long#define _LL __int64using namespace std;const int INF = 0x3f3f3f3f;int main(){    int c,d,n,m,k;    while(~scanf("%d %d %d %d %d",&c,&d,&n,&m,&k))    {        int res = n*m;        int a,b,maxa,tmp,ans = INF;        if(res <= k)            printf("0\n");        else        {            res = res-k;            if(res%n == 0)                maxa = res/n;            else maxa = res/n+1;            for(a = 0; a <= maxa; a++)            {                b = res - a*n;                if(b < 0) b = 0;                tmp = a*c + b*d;                         ans = min(tmp,ans);            }            printf("%d\n",ans);        }    }    return 0;}


http://codeforces.com/contest/417/problem/B

给出n对数,每一对有 x和k,在x>0的前提下,对于当前第i对数判断是否有一对数j(j< i)使得a[j].x == a[i].x-1 并且a[j].k == a[i].k。

n等于1的情况没加特判。原本可以涨rating的吧。。以后要思考全面啊。


#include <stdio.h>#include <string.h>#include <algorithm>#define LL long long#define _LL __int64using namespace std;const int INF = 0x3f3f3f3f;struct node{    int x,k;}a[100010];int n;int main(){    while(~scanf("%d",&n))    {        for(int i = 1; i <= n; i++)            scanf("%d %d",&a[i].x,&a[i].k);        if(n == 1)        {            if(a[n].x == 0)                printf("YES\n");            else                 printf("NO\n");            continue;        }        int f = 1,i,j;        for(i = 2; i <= n; i++)        {            if(a[i].x == 0) continue;            for(j = i-1; j >= 1; j--)            {                if(a[i].k == a[j].k && a[j].x == a[i].x-1)                    break;            }            if(j == 0)            {                f = 0;                break;            }        }        if(f == 0)            printf("NO\n");        else printf("YES\n");    }    return 0;}


http://codeforces.com/contest/417/problem/C

题意:输入n和k,有n个队比赛,每两个队最多只能比赛一场,每个队要赢其他k个队。问使最后所有对打平的比赛结果。否则输出-1

思路:因为每两个对只能比一场,所以每两个点之间是一条无向边,n个顶点最多有n*(n-1)/2条无向边。每个队都要赢其他k个队,所以n个点要发出n*k条边。只需比较n*k与n*(n-1)/2的大小即可。


int main(){    int n,k;    while(~scanf("%d %d",&n,&k))    {        int res = n*k;        if(res > n*(n-1)/2)            printf("-1\n");        else        {            printf("%d\n",n*k);            for(int i = 1; i <= n; i++)            {                for(int j = 1; j <= k; j++)                {                    if(i+j <= n)                        printf("%d %d\n",i,i+j);                    else                    {                        printf("%d %d\n",i,(i+j)%n);                    }                }            }        }    }    return 0;}



0 0
原创粉丝点击