Codeforces Round #347 (Div. 2)

时间:2021-12-06 06:21:14

unrating的一场CF

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[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;
}

贪心 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;
}