RCC 2014 Warmup (Div. 2) A~C

近期CF的pretext真是一场比一场弱。第一次在CF上被卡cin。cout歧视。。。。


A. Elimination
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

The finalists of the "Russian Code Cup" competition in 2214 will be the participants who win in one of the elimination rounds.

The elimination rounds are divided into main and additional. Each of the main elimination rounds consists of c problems, the winners of the round are the first n people in the rating list. Each of the additional elimination rounds consists of d problems. The winner of the additional round is one person. Besides, kwinners of the past finals are invited to the finals without elimination.

As a result of all elimination rounds at least n·m people should go to the finals. You need to organize elimination rounds in such a way, that at least n·m people go to the finals, and the total amount of used problems in all rounds is as small as possible.

Input

The first line contains two integers c and d (1 ≤ c, d ≤ 100) — the number of problems in the main and additional rounds, correspondingly. The second line contains two integers n and m (1 ≤ n, m ≤ 100). Finally, the third line contains an integer k (1 ≤ k ≤ 100) — the number of the pre-chosen winners.

Output

In the first line, print a single integer — the minimum number of problems the jury needs to prepare.

Sample test(s)
input
1 10
7 2
1
output
2
input
2 2
2 1
2
output
0

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int c,d,n,m,k,s;

int main()
{
    cin>>c>>d>>n>>m>>k;
    s=n*m-k;
    if(s<=0)
    {
        puts("0"); return 0;
    }
    int ans=0;
    if(c<d*n)
    {
        int num_ma=s/n;
        ans+=num_ma*c;
        int resman=s%n;
        ans+=min(resman*d,c);
    }
    else
    {
        ans=s*d;
    }
    cout<<ans<<endl;
    return 0;
}


B. Crash
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

During the "Russian Code Cup" programming competition, the testing system stores all sent solutions for each participant. We know that many participants use random numbers in their programs and are often sent several solutions with the same source code to check.

Each participant is identified by some unique positive integer k, and each sent solution A is characterized by two numbers: x — the number of different solutions that are sent before the first solution identical to A, and k — the number of the participant, who is the author of the solution. Consequently, all identical solutions have the same x.

It is known that the data in the testing system are stored in the chronological order, that is, if the testing system has a solution with number x (x > 0) of the participant with number k, then the testing system has a solution with number x - 1 of the same participant stored somewhere before.

During the competition the checking system crashed, but then the data of the submissions of all participants have been restored. Now the jury wants to verify that the recovered data is in chronological order. Help the jury to do so.

Input

The first line of the input contains an integer n (1 ≤ n ≤ 105) — the number of solutions. Each of the following n lines contains two integers separated by space x and k (0 ≤ x ≤ 1051 ≤ k ≤ 105) — the number of previous unique solutions and the identifier of the participant.

Output

A single line of the output should contain «YES» if the data is in chronological order, and «NO» otherwise.

Sample test(s)
input
2
0 1
1 1
output
YES
input
4
0 1
1 2
1 1
0 2
output
NO
input
4
0 1
1 1
0 1
0 2
output
YES
排序乱搞。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

struct ooxx
{
    int x,y,id;
}a[110000];

bool cmpA(ooxx a,ooxx b)
{
    if(a.y!=b.y) return a.y<b.y;
    return a.id<b.id;
}

int n;

int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&a[i].x,&a[i].y);
        a[i].id=i;
    }
    sort(a,a+n,cmpA);

    bool flag=true;
    int last=-1,eb=-1;

    for(int i=0;i<n&&flag;i++)
    {
        if(last!=a[i].y)
        {
            last=a[i].y; eb=0;
            if(a[i].x!=0) flag=false;
        }
        else
        {
            if(a[i].x<=eb) continue;
            else if(a[i].x==eb+1) eb++;
            else flag=false;
        }
    }
    if(flag==false) puts("NO");
    else puts("YES");
    return 0;
}


C. Football
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

One day, at the "Russian Code Cup" event it was decided to play football as an out of competition event. All participants was divided inton teams and played several matches, two teams could not play against each other more than once.

The appointed Judge was the most experienced member — Pavel. But since he was the wisest of all, he soon got bored of the game and fell asleep. Waking up, he discovered that the tournament is over and the teams want to know the results of all the matches.

Pavel didn't want anyone to discover about him sleeping and not keeping an eye on the results, so he decided to recover the results of all games. To do this, he asked all the teams and learned that the real winner was friendship, that is, each team beat the other teams exactly k times. Help Pavel come up with chronology of the tournir that meets all the conditions, or otherwise report that there is no such table.

Input

The first line contains two integers — n and k (1 ≤ n, k ≤ 1000).

Output

In the first line print an integer m — number of the played games. The following m lines should contain the information about all the matches, one match per line. The i-th line should contain two integers ai and bi (1 ≤ ai, bi ≤ nai ≠ bi). The numbers ai and bi mean, that in the i-th match the team with number ai won against the team with number bi. You can assume, that the teams are numbered from1 to n.

If a tournir that meets the conditions of the problem does not exist, then print -1.

Sample test(s)
input
3 1
output
3
1 2
2 3
3 1

隔k个数,连一条边。。。。 输出非常多,卡CIN,COUT

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

typedef pair<int,int> pII;

int indegree[2000];
bool ck[1100][1100];
int n,k;
vector<pII> ans;

int main()
{
    cin>>n>>k;
    for(int l=1;l<=k;l++)
    {
        for(int i=0;i<n;i++)
        {
            int j=(i+l)%n;
            if(indegree[j]+1>k||j==i||ck[i][j]||ck[j][i])
            {
                puts("-1"); return 0;
            }
            else
            {
                indegree[j]++;
                ck[i][j]=ck[j][i]=1;
                ans.push_back(make_pair(i,j));
            }
        }
    }
    int sz=ans.size();
    printf("%d
",sz);
    for(int i=0;i<sz;i++)
    {
        printf("%d %d
",ans[i].first+1,ans[i].second+1);
    }
    return 0;
}




原文地址:https://www.cnblogs.com/gavanwanggw/p/6733547.html