标签:codeforces
比赛链接:http://codeforces.com/contest/432
The Saratov State University Olympiad Programmers Training Center (SSU OPTC) has n students. For each student you know the number of times he/she has participated in the ACM ICPC world programming championship. According to the ACM ICPC rules, each person can participate in the world championship at most 5 times.
The head of the SSU OPTC is recently gathering teams to participate in the world championship. Each team must consist of exactly three people, at that, any person cannot be a member of two or more teams. What maximum number of teams can the head make if he wants each team to participate in the world championship with the same members at least k times?
The first line contains two integers, n and k (1?≤?n?≤?2000; 1?≤?k?≤?5). The next line contains n integers: y1,?y2,?...,?yn (0?≤?yi?≤?5), where yi shows the number of times the i-th person participated in the ACM ICPC world championship.
Print a single number — the answer to the problem.
5 2
0 4 5 1 0
1
6 4
0 1 2 3 4 5
0
6 5
0 0 0 0 0 0
2
In the first sample only one team could be made: the first, the fourth and the fifth participants.
In the second sample no teams could be created.
In the third sample two teams could be created. Any partition into two teams fits.
题目大意:有n个人,每个人已经参加了yi次比赛,要求三个人组一个队,每个人组多参加5次比赛,每个人只能在一个队里,现在求至少参加k次,可以组出几个队
题目分析:贪心,按参加次数从小到大排序,要注意必须3人一队
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int a[2005]; int main() { int n, k, ans = 0; scanf("%d %d", &n, &k); for(int i = 0; i < n; i++) scanf("%d", &a[i]); sort(a, a + n); for(int i = 0; i < n - (n % 3); i += 3) if(a[i] + k <= 5 && a[i + 1] + k <= 5 && a[i + 2] + k <= 5) ans ++; printf("%d\n", ans); }
Consider a football tournament where n teams participate. Each team has two football kits: for home games, and for away games. The kit for home games of the i-th team has color xi and the kit for away games of this team has color yi (xi?≠?yi).
In the tournament, each team plays exactly one home game and exactly one away game with each other team (n(n?-?1) games in total). The team, that plays the home game, traditionally plays in its home kit. The team that plays an away game plays in its away kit. However, if two teams has the kits of the same color, they cannot be distinguished. In this case the away team plays in its home kit.
Calculate how many games in the described tournament each team plays in its home kit and how many games it plays in its away kit.
The first line contains a single integer n (2?≤?n?≤?105) — the number of teams. Next n lines contain the description of the teams. The i-th line contains two space-separated numbers xi, yi (1?≤?xi,?yi?≤?105; xi?≠?yi) — the color numbers for the home and away kits of the i-th team.
For each team, print on a single line two space-separated integers — the number of games this team is going to play in home and away kits, correspondingly. Print the answers for the teams in the order they appeared in the input.
2
1 2
2 1
2 0
2 0
3
1 2
2 1
1 3
3 1
4 0
2 2
题目大意:这题是考阅读理解的,n个球队,每个球队和剩下n-1只球队打2场比赛,一场在主场,一场在客场,每个球队有一个主场卡和客场卡,如果A队去B队的主场打比赛,可是A队的客场卡数字与B队主场卡数字相同,则A队用他们的主场卡,输入的顺序就是队伍的顺序,问每队分别要用多少次自己的主场卡和客场卡
题目分析:每队用几次自己的主场卡,取决于他的客场卡和多少个队的主场卡相同(记为cnt[away]),我们先预处理出各个主场卡的数量,显然每个队至少要用n-1次自己的主场卡,然后还要用cnt[away]次主场卡来避免重复,所以一共要用n-1+cnt[away]次主场卡,因为总的比赛次数确定为2n - 2,所以客场卡用的次数为n-1-cnt[away]
#include <cstdio> #include <cstring> int const MAX = 1e5 + 5; int x[MAX], y[MAX], cnt[MAX]; int main() { int n; scanf("%d", &n); memset(cnt, 0, sizeof(cnt)); for(int i = 0; i < n; i++) { scanf("%d %d", &x[i], &y[i]); cnt[x[i]] ++; } for(int i = 0; i < n; i++) printf("%d %d\n", n - 1 + cnt[y[i]], n - 1 - cnt[y[i]]); }
You have an array a[1],?a[2],?...,?a[n], containing distinct integers from 1 to n. Your task is to sort this array in increasing order with the following operation (you may need to apply it multiple times):
You do not need to minimize the number of used operations. However, you need to make sure that there are at most 5n operations.
The first line contains integer n (1?≤?n?≤?105). The next line contains n distinct integers a[1],?a[2],?...,?a[n] (1?≤?a[i]?≤?n).
In the first line, print integer k (0?≤?k?≤?5n) — the number of used operations. Next, print the operations. Each operation must be printed as "i j" (1?≤?i?<?j?≤?n; (j?-?i?+?1) is a prime).
If there are multiple answers, you can print any of them.
3
3 2 1
1
1 3
2
1 2
0
4
4 2 3 1
3
2 4
1 2
2 4
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; int const MAX = 1e5 + 5; int a[MAX], x[5 * MAX], y[5 * MAX], pos[MAX]; bool prime[MAX]; void get_prime() { memset(prime, true, sizeof(prime)); prime[1] = false; for(int i = 2; i <= sqrt(MAX); i++) if(prime[i]) for(int j = i * i; j <= MAX; j += i) prime[j] = false; } int main() { int n; scanf("%d", &n); get_prime(); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); pos[a[i]] = i; } int cnt = 0; for(int i = 1; i <= n; i++) { for(int now = pos[i]; now > i; ) { int tmp = i; while(!prime[now - tmp + 1]) tmp ++; //找到与其排序位最接近的点 x[cnt] = tmp; y[cnt ++] = now; //交换一次并记录 pos[a[tmp]] = now; //更换被交换数的pos swap(a[tmp], a[now]); //交换两个数 now = tmp; //当前数字继续向前交换 } } printf("%d\n", cnt); for(int i = 0; i < cnt; i++) printf("%d %d\n", x[i], y[i]); }
You have a string s?=?s1s2...s|s|, where |s| is the length of string s, and si its i-th character.
Let‘s introduce several definitions:
Your task is, for any prefix of string s which matches a suffix of string s, print the number of times it occurs in string s as a substring.
The single line contains a sequence of characters s1s2...s|s| (1?≤?|s|?≤?105) — string s. The string only consists of uppercase English letters.
In the first line, print integer k (0?≤?k?≤?|s|) — the number of prefixes that match a suffix of string s. Next print k lines, in each line print two integers li ci. Numbers li ci mean that the prefix of the length li matches the suffix of length li and occurs in string s as a substring ci times. Print pairs li ci in the order of increasing li.
ABACABA
3
1 4
3 2
7 1
AAA
3
1 3
2 2
3 1
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int const MAX = 1e5 + 10; int next[MAX], le[MAX], t[MAX], num[MAX]; char s[MAX]; void get_next() { int i = 0, j = -1; next[0] = -1; while(s[i] != '\0') { if(j == -1 || s[i] == s[j]) { i ++; j ++; next[i] = j; } else j = next[j]; } } int main() { scanf("%s", s); int len = strlen(s); get_next(); for(int i = 1; i <= len; i++) num[i] = 1; for(int i = len; i >= 0; i--) if(next[i]) num[next[i]] += num[i]; for( int i = 0; i <= len; i++) printf("num[%d] = %d\n", i, num[i]); int cnt = 0; le[cnt] = len; t[cnt ++] = 1; len = next[len]; while(len) { le[cnt] = len; t[cnt ++] = num[len]; len = next[len]; } printf("%d\n", cnt); for(int i = cnt - 1; i >= 0; i--) printf("%d %d\n", le[i], t[i]); }
版权声明:本文为博主原创文章,未经博主允许不得转载。
Codeforces Round #246 (Div. 2) (ABCD详细题解)
标签:codeforces
原文地址:http://blog.csdn.net/tc_to_top/article/details/46929443