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; }
给出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; }
题意:输入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; }