Codeforces Round #231 (Div. 2)
Problems # Name A Counting Sticks standard input/output 1 s, 256 MB x2326 B Very Beautiful Number standard input/output 1 s, 256 MB x856 C Dominoes standard input/output 2 s, 256 MB x803 D Physical Education and Buns standard input/output
Problems
# | Name | ||
---|---|---|---|
A |
Counting Sticks
standard input/output 1 s, 256 MB |
x2326 | |
B |
Very Beautiful Number
standard input/output 1 s, 256 MB |
x856 | |
C |
Dominoes
standard input/output 2 s, 256 MB |
x803 | |
D |
Physical Education and Buns
standard input/output 2 s, 256 MB |
x234 | |
E |
Lightbulb for Minister
standard input/output 1 s, 256 MB |
x49 |
A题:先处理字符串把3个位置的数字保存下来,在去判断相等或者差值为2,去移动即可。
B题:枚举最后一位数字,模拟往前推数字,推到第一位判断是不是和一开始枚举的数字相同。
C题:贪心,10和01其实是一样的,所以先保存下11,10和01的总数,00的个数,先从左往右放11,放完之后,在从右边往左边去放10,01,每行交替着放即可,剩下的就是00。
D题:从小到大排序后,先枚举公差d,先变化后的序列A1是0,然后求出整个需要去向上移动的最大值和最小值(可能是负的),那么变化后的序列其实可以看成一条斜率k是d,b是A1的直线,然后这条直线无论上移下移,那么对于最大值和最小值肯定还是原来那2个位置,那么只要保证移动到最大值和最小值中的最大值尽可能小,那么就是去中间肯定是最优的,为(up + down + 1)/2 (要向上取整所以+1),最后维护ans的最小值即可。
D题:还有一种解法,二分答案,然后去判断,判断的方式先枚举公差,在用O(n)的方法去维护每个上下区间从大到小。
代码:
A题:
#include#include char c; int main() { int num[3], s = 0; memset(num, 0, sizeof(num)); while ((c = getchar()) != EOF && c != '\n') { if (c == '+' || c == '=') s++; else num[s]++; } if (num[0] - 1 + num[1] == num[2] + 1) { if (num[0] == 1) num[1]--; else if (num[1] == 1) num[0]--; else if (num[0] != 1 && num[1] != 1) num[0]--; num[2]++; } else if (num[0] + num[1] == num[2]) { } else if (num[0] + 1 + num[1] == num[2] - 1) { if (num[2] == 1) { printf("Impossible\n"); return 0; } num[2]--; num[0]++; } else { printf("Impossible\n"); return 0; } int i; for (i = 0; i
B题:#include#include int p, x, ans[1000005]; int main() { scanf("%d%d", &p, &x); int yu = 0; for (int i = 0; i = 0; j--) printf("%d", ans[j]); printf("\n"); return 0; } } printf("Impossible\n"); return 0; } C题:
#include#include int n, m, i, j; int num10, num00, num11; char str[10], ans[1005][1005][4]; int main() { num10 = num00 = num11 = 0; scanf("%d%d", &n, &m); for (i = 0; i
D题1:#include#include #include #define INF 0x3f3f3f3f #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a) res) { ans = res; start = -up + res; dd = d; } } printf("%d\n%d %d\n", ans, start, dd); } int main() { scanf("%d", &n); for (int i = 0; i
D题2:#include#include #include #define INF 0x3f3f3f3f #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)= 0; i--) { up = min(num[i] + Max, up - d); down = max(num[i] - Max, down - d); } if (down
上一篇: 成员属性在两个步骤之间无法共用
推荐阅读
-
Codeforces Round #231 (Div. 2)
-
Codeforces Round #220 (Div. 2) D 树状数组 && 二分_html/css_WEB-ITnose
-
Codeforces Round #247 (Div. 2) ABC
-
Codeforces Round #FF (Div. 2) 题解
-
Codeforces Beta Round #4 (Div. 2 Only) D. Mysterious Present_html/css_WEB-ITnose
-
Codeforces Round #201 (Div. 2) ABC 水题3道
-
Codeforces Round #277 (Div. 2)_html/css_WEB-ITnose
-
Codeforces Round #256 (Div. 2) A. Rewards_html/css_WEB-ITnose
-
Codeforces Round #261 (Div. 2)[ABCDE]
-
codeforces Round #260(div2) A解题报告