https://codeforces.com/contest/1405
A. Permutation Forgery

题目大意:
给定一个序列,其中每两项和另做一个序列。要求对原序列重新排序,使得其和序列中的元素大小不变(顺序任意)
题解:
Trick题,只需要把原序列倒过来输出一遍就可以。
AC代码:
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <set>
#include <cmath>
#include <ctime>
#include <queue>
using namespace std;
typedef long long LL;
int T;
const LL inf = 0x3f3f3f3f;
int a[105];
int b[105];
int c[105];
int main() {
cin >> T;
int n;
while(T--) {
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
cin >> n;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
for(int i = n - 1; i >= 0; i-- )
cout << a[i] << " ";
cout << endl;
}
return 0;
}
B. Array Cancellation

题目大意:
给定一队序列,如果序列中,正数在前,负数在后,可以同时对正数-1,为负数+1,但如果正负数顺序相反,执行这样的操作将花费一个coin,问最终如果想要所有元素为0,需要花费多少。
题解:
只需要使用两个标志量模拟即可。一个anspos负责记录当前序列中仍然存留的正数大小,ansneg负责记录未被正数消耗掉,或是无法被正数抵消而残留的负数值,最终输出ansneg即可。
AC代码:
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <set>
#include <cmath>
#include <ctime>
#include <queue>
using namespace std;
typedef long long LL;
int T;
const LL inf = 0x3f3f3f3f;
const int maxn = 1e5 + 5;
int a[maxn];
int main() {
cin >> T;
int n;
while(T--) {
cin >> n;
for(int i = 0; i < n ; i++) {
cin >> a[i];
}
LL anspos = 0, ansneg = 0;
for(int i = 0; i < n; i++) {
if(a[i] >= 0) {
anspos += a[i];
}
else {
if(anspos) {
if(anspos >= abs(a[i])){
anspos += a[i];
}
else {
a[i] += anspos;
anspos = 0;
ansneg += a[i];
}
}else {
ansneg += a[i];
}
}
}
cout << anspos << endl;
}
return 0;
}
C. Balanced Bitstring

题目大意:
给定一个N长的字符串,试问其能不能满足每个K字串中0和1的数量相等。
题解:
首先要发现一个重要规律,若可以满足,则序列必定是一个以K为循环节的循环序列。
因为对于两个相邻K-子序列而言,如N = 10, K = 4;考察S1[0~3]和S2[1~4]
其中S1[1~3]与 S2[1~3]相同,若满足条件,则S1[0]与S2[4]必须相同,因此递推可得,N必以K为循环节。
接下来仅需检查这一点即可。
AC代码:
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <set>
#include <cmath>
#include <ctime>
#include <queue>
using namespace std;
typedef long long LL;
int T;
int n, k, t;
string s;
int main() {
cin >> T;
int n;
while(T--) {
cin >> n >> k >> s;
int zero = 0, one = 0;
bool chk = true;
for(int i = 0; i < k; i++) {
int tmp = -1;
for(int j = i; j < n; j += k) {
if(s[j] != '?') {
if(tmp != -1 && s[j] - '0' != tmp) {
chk = false;
break;
}
tmp = s[j] - '0';
}
}
if(tmp != -1) {
(tmp == 0 ? zero++:one++);
}
}
if(max(zero,one) > k / 2) {
chk = false;
}
cout << (chk? "YES\n" : "NO\n");
}
return 0;
}
本文解析了CodeForces竞赛中的三道题目,包括PermutationForgery、ArrayCancellation和BalancedBitstring,提供了详细的题解思路和AC代码实现。
1519

被折叠的 条评论
为什么被折叠?



