RCC Warmup

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 __int64

using 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 __int64

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



你可能感兴趣的:(RCC Warmup)