Codeforces Round #347 (Div. 2)
2016-04-19 19:26
357 查看
unrating的一场CF
A - Complicated GCD
贪心 B - Rebus
取最小最大,从最大调到n
贪心 C - International Olympiad
头晕,看不懂题意
Consider the abbreviations that are given to the first Olympiads. The first 10 Olympiads (from year 1989 to year 1998) receive one-digit abbreviations (IAO'9, IAO'0, ..., IAO'8). The next 100 Olympiads (1999 - 2098) obtain two-digit abbreviations, because all one-digit abbreviations are already taken, but the last two digits of 100 consecutive integers are pairwise different. Similarly, the next 1000Olympiads get three-digit abbreviations and so on.
Now examine the inversed problem (extract the year from an abbreviation). Let the abbreviation have k digits, then we know that all Olympiads with abbreviations of lengths (k - 1), (k - 2), ..., 1 have passed before this one. The number of such Olympiads is10k - 1 + 10k - 2 + ... + 101 = F and the current Olympiad was one of the 10k of the following. Therefore this Olympiad was held in years between (1989 + F) and (1989 + F + 10k - 1). As this segment consists of exactly 10k consecutive natural numbers, it contains a single number with a k-digit suffix that matches the current abbreviation. It is also the corresponding year.
A - Complicated GCD
#include <bits/stdc++.h> const int N = 1e5 + 5; char a[105], b[105]; bool equal() { int lena = strlen (a); int lenb = strlen (b); if (lena != lenb) { return false; } for (int i=0; i<lena; ++i) { if (a[i] != b[i]) { return false; } } return true; } int main() { scanf ("%s%s", a, b); if (equal ()) { printf ("%s\n", a); } else { puts ("1"); } return 0; }
贪心 B - Rebus
取最小最大,从最大调到n
#include <bits/stdc++.h> const int N = 1e3 + 5; char str ; int n, x, y; int main() { gets (str); int len = strlen (str); x = 1; y = 0; for (int i=0; i<len; ++i) { if (str[i] == '+') { x++; } else if (str[i] == '-') { y++; } else if (str[i] >= '0' && str[i] <= '9') { n = n * 10 + (str[i] - '0'); } } int mx = x * n - y; int mn = x - n * y; if (n > mx || n < mn) { puts ("Impossible"); } else { int f = 0, sp = 0; int xx = 0, yy = 0, now = mx; while (now > n) { if (now - n + 1 > n) { now -= (n - 1); if (xx < x) { xx++; } else { yy++; } } else { int d = now - n; if (xx < x) { f = -1; sp = n - d; } else { f = 1; sp = 1 + d; } break; } } puts ("Possible"); for (int i=0; i<len; ++i) { if (str[i] == '?') { if (i == 0) { if (f == -1) { printf ("%d", sp); f = 0; } else if (xx > 0) { printf ("1"); xx--; } else { printf ("%d", n); } } else { if (str[i - 2] == '+') { if (f == -1) { printf ("%d", sp); f = 0; } else if (xx > 0) { printf ("1"); xx--; } else { printf ("%d", n); } } else { if (f == 1) { printf ("%d", sp); f = 0; } else if (yy > 0) { printf ("%d", n); yy--; } else { printf ("1"); } } } } else { printf ("%c", str[i]); } } puts (""); } return 0; }
贪心 C - International Olympiad
头晕,看不懂题意
Consider the abbreviations that are given to the first Olympiads. The first 10 Olympiads (from year 1989 to year 1998) receive one-digit abbreviations (IAO'9, IAO'0, ..., IAO'8). The next 100 Olympiads (1999 - 2098) obtain two-digit abbreviations, because all one-digit abbreviations are already taken, but the last two digits of 100 consecutive integers are pairwise different. Similarly, the next 1000Olympiads get three-digit abbreviations and so on.
Now examine the inversed problem (extract the year from an abbreviation). Let the abbreviation have k digits, then we know that all Olympiads with abbreviations of lengths (k - 1), (k - 2), ..., 1 have passed before this one. The number of such Olympiads is10k - 1 + 10k - 2 + ... + 101 = F and the current Olympiad was one of the 10k of the following. Therefore this Olympiad was held in years between (1989 + F) and (1989 + F + 10k - 1). As this segment consists of exactly 10k consecutive natural numbers, it contains a single number with a k-digit suffix that matches the current abbreviation. It is also the corresponding year.
#include <bits/stdc++.h> char str[20]; int main() { int n; scanf ("%d", &n); for (int i=0; i<n; ++i) { scanf ("%s", str); int len = strlen (str + 4); int year = atoi (str + 4); int add = 0, tenpow = 10; for (int j=1; j<len; ++j) { add += tenpow; tenpow *= 10; } while (year < 1989 + add) { year += tenpow; } printf ("%d\n", year); } return 0; }
相关文章推荐
- 每日工作总结01
- 南京理工校赛 c count_prime 容斥原理 求(1,r)与n互质模板
- 线程的控制与分离
- [C语言][LeetCode][82]Remove Duplicates from Sorted List II
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_1_圆生成算法
- 综合案例 第80课:Spark SQL网站搜索综合案例实战 以京东找出搜索平台上用户每天搜索排名5名的产品,The hottest!
- 广告条目的android代码,常使用
- JavaScript匿名函数
- 图解VC6辅助编程工具的使用
- Quartz的触发器使用
- Filter的应用——IP计数
- Java入门(概述篇)
- Python学习(4)运算符
- android SQLite(安卓数据库的插入显示删除)
- JavaScript动态函数
- 串(链串)
- 面试题89:字符串数组首尾字符相同
- python基础教程第4章——字典
- JavaScript数据类型
- FJNUOJ1156