unrating的一场CF
#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 ", a); } else { puts ("1"); } return 0; }
贪心 B - Rebus
取最小最大,从最大调到n
#include <bits/stdc++.h> const int N = 1e3 + 5; char str[N]; 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; }
头晕,看不懂题意
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 ", year); } return 0; }