这是一场三人组队赛来的,单人带电子模板不限时单挑试一下。按照难度排序。
题意:玩祖玛,射入任意颜色的球一个,当某段长度变长了且长度变长后>=3则这段就会消除,问把所有的球只用一次射击就消除的方法是多少?
题解:看起来一定要两边对称。
int n;
char s[300005];
int L[300005], R[300005], top;
void test_case() {
top = 0;
L[++top] = 1;
R[top] = 1;
for(int i = 2; i <= n; ++i) {
if(s[i] == s[R[top]])
R[top] = i;
else {
L[++top] = i;
R[top] = i;
}
}
if(!(top & 1)) {
puts("0");
return;
}
int mid = (top + 1) / 2;
if(R[mid] == L[mid]) {
puts("0");
return;
}
for(int i = 1; i < mid; ++i) {
if(s[R[mid - i]] != s[L[mid + i]]) {
puts("0");
return;
} else {
if(R[mid - i] - L[mid - i] + 1 + R[mid + i] - L[mid + i] + 1 < 3) {
puts("0");
return;
}
}
}
printf("%d\n", R[mid] - L[mid] + 1 + 1);
}
int main() {
#ifdef KisekiPurin
freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
while(1) {
n = reads(s + 1);
test_case();
}
}
题意:给n*l个字母,构造n个长为l的字符串,使得字典序最小的第k个字符串的字典序最小。
题解:别看错题了,下面的解法是错的。
int n, l, k;
char s[1000005];
void test_case() {
sort(s + 1, s + 1 + n * l);
int cur = l + 1;
for(int i = 1; i < k; ++i) {
for(int j = 1; j <= l; ++j) {
putchar(s[cur]);
++cur;
}
putchar('\n');
}
for(int j = 1; j <= l; ++j)
putchar(s[j]);
putchar('\n');
for(int i = k + 1; i <= n; ++i) {
for(int j = 1; j <= l; ++j) {
putchar(s[cur]);
++cur;
}
putchar('\n');
}
}
int main() {
#ifdef KisekiPurin
freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
while(1) {
read(n), read(l), read(k);
reads(s + 1);
//puts(s + 1);
test_case();
}
}
int n, l, k;
char s[1000005];
char t[1005][1005];
void test_case() {
sort(s + 1, s + 1 + n * l);
int cur = 0;
for(int j = 1; j <= l; ++j) {
for(int i = 1; i <= k; ++i)
t[i][j] = s[++cur];
if(k == 1 || t[k][j] != t[k - 1][j]) {
for(int tj = j + 1; tj <= l; ++tj)
t[k][tj] = s[++cur];
for(int ti = 1; ti < k; ++ti) {
for(int tj = j + 1; tj <= l; ++tj)
t[ti][tj] = s[++cur];
}
break;
}
}
for(int i = k + 1; i <= n; ++i) {
for(int j = 1; j <= l; ++j)
t[i][j] = s[++cur];
}
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= l; ++j)
putchar(t[i][j]);
putchar('\n');
}
}
int main() {
#ifdef KisekiPurin
freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
while(1) {
read(n), read(l), read(k);
reads(s + 1);
//puts(s + 1);
test_case();
}
}
但是这样填也不对,过不了这个样例:
4 4 4
abcdefabababcabc
aabc
abbd
abce
abcf
#至少应该是
aaef
abbd
abcc
abcc
不知道这样对不对?
int n, l, k;
char s[1000005];
char t[1005][1005];
void test_case() {
sort(s + 1, s + 1 + n * l);
int cur = 0, b = 1;
for(int j = 1; j <= l; ++j) {
for(int i = b; i <= k; ++i) {
t[i][j] = s[++cur];
if(i > 1 && t[i][j] > t[i - 1][j])
++b;
}
if(k == 1 || t[k][j] != t[k - 1][j]) {
for(int tj = j + 1; tj <= l; ++tj)
t[k][tj] = s[++cur];
for(int ti = 1; ti < k; ++ti) {
for(int tj = 1; tj <= l; ++tj)
if(t[ti][tj] == '\0')
t[ti][tj] = s[++cur];
}
break;
}
}
for(int i = k + 1; i <= n; ++i) {
for(int j = 1; j <= l; ++j)
t[i][j] = s[++cur];
}
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= l; ++j)
putchar(t[i][j]);
putchar('\n');
}
}
int main() {
#ifdef KisekiPurin
freopen("KisekiPurin.in", "r", stdin);
#endif // KisekiPurin
while(1) {
read(n), read(l), read(k);
reads(s + 1);
memset(t, '\0', sizeof(t));
//puts(s + 1);
test_case();
}
}
还是WA29。
2019-2020 ICPC, NERC, Northern Eurasia Finals (Unrated, Online Mirror, ICPC Rules, Teams Preferred)
原文:https://www.cnblogs.com/KisekiPurin2019/p/12085252.html