A
这题一定要且只能修改一个字符
#include <cstdio>
#include <cstring>
#include <cmath>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <utility>
using namespace std;
#define LL long long
#define pb push_back
#define pill pair<int, int>
#define mk make_pair
#define mst(a, x) memset(a, x, sizeof(a))
#define REP(i, x, n) for(int i = x; i < n; ++i)
const int qq = 1e5 + 10;
int num[qq];
int n, m, k;
char st[20];
int main(){
scanf("%s", st);
int len = strlen(st);
int ans = 0;
int l = 0, r = strlen(st) - 1;
while(l < r){
if(st[l] != st[r]) ans++;
l++, r--;
}
if(ans == 1) puts("YES");
else if(ans == 0 && len % 2 == 1) puts("YES");
else puts("NO");
return 0;
}
模拟模拟、
只能删掉字符串左边第一个,然后放到最后面。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <utility>
using namespace std;
#define LL long long
#define pb push_back
#define pill pair<int, int>
#define mk make_pair
#define mst(a, x) memset(a, x, sizeof(a))
#define REP(i, x, n) for(int i = x; i < n; ++i)
const int qq = 1e5 + 10;
int n, m, k;
string st[55];
int Calcul(string x, string y){
int cnt = 0;
int len = (int)x.size();
while(x != y){
char ch = y[0];
y.erase(y.begin());
y += ch;
cnt++;
if(cnt >= len) return len;
}
return cnt;
}
int main(){
cin >> n;
for(int i = 0; i < n; ++i){
cin >> st[i];
}
int minx = 1e9;
string x = st[0];
int len = (int)x.size();
for(int i = 0; i < len; ++i){
int num = 0;
for(int j = 0; j < n; ++j){
string y = st[j];
int cnt = Calcul(x, y);
if(cnt >= len){
puts("-1");
return 0;
}
num += cnt;
}
minx = min(minx, num);
char ch = x[0];
x.erase(x.begin());
x += ch;
}
cout << minx << endl;
return 0;
}
C
(a, b) -> (a - b, a + b) -> (-2b, 2a)
很显然这个式子成立肯定就没有NO
因为若干偶数的gcd 一定是 大于1的,这个很容易想到、
最终结果就是把所有数都变成偶数
如果是两个奇数只需要一次变换,奇偶需要两次
#include <cstdio>
#include <cstring>
#include <cmath>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <utility>
using namespace std;
#define LL long long
#define pb push_back
#define pill pair<int, int>
#define mk make_pair
#define mst(a, x) memset(a, x, sizeof(a))
#define REP(i, x, n) for(int i = x; i < n; ++i)
const int qq = 1e5 + 10;
LL num[qq];
int p[qq];
int n;
LL gcd(LL a, LL b){
return b == 0 ? a : gcd(b, a % b);
}
int main(){
scanf("%d", &n);
LL t = 0;
for(int i = 0; i < n; ++i){
scanf("%lld", num + i);
if(i == 0) t = num[i];
else t = gcd(t, num[i]);
num[i] = num[i] % 2;
}
if(t != 1){
printf("YES\n0\n");
return 0;
}
int ans = 0;
for(int i = 0; i < n; ++i){
if(num[i] == 1){
if(i + 1 < n){
if(num[i + 1] == 1){
ans += 1;
}
else{
ans += 2;
}
num[i] = num[i + 1] = 0;
}else{
ans += 2;
}
}
}
printf("YES\n%d\n", ans);
return 0;
}
D
对于一个乱序的系列a, (序列长度为偶数)对于每两个a[i] a[i + 1], 我们如果都选择其中较大的一个,那么最终选出来的数的两倍一定大于原数组的和,奇数情况下就是随便选一个数,然后剩下的数就是偶数情况。
这题的话我们讲每一个a[i], b[i], i看成一个整体,首先我们对a数组大小排各序,我们拿掉排序结果最大的那一组,对剩下的进行b[i] b[i + 1]进行取最大的即可。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <utility>
using namespace std;
#define LL long long
#define pb push_back
#define pill pair<int, int>
#define mk make_pair
#define mst(a, x) memset(a, x, sizeof(a))
#define REP(i, x, n) for(int i = x; i < n; ++i)
const int qq = 1e5 + 10;
int n, m, k;
tuple<int, int, int> t[qq];
int x[qq], y[qq];
int id[qq];
int main(){
scanf("%d", &n);
for(int i = 0; i < n; ++i){
cin >> x[i];
}
for(int i = 0; i < n; ++i){
cin >> y[i];
}
for(int i = 0; i < n; ++i){
t[i] = make_tuple(x[i], y[i], i + 1);
}
sort(t, t + n);
int cnt = 0;
int a, b, c;
tie(a, b, c) = t[n - 1];
id[cnt++] = c;
int d, e, f;
for(int i = n - 2; i >= 0; i -= 2){
tie(a, b, c) = t[i];
tie(d, e, f) = t[i - 1];
if(b > e){
id[cnt++] = c;
}else{
id[cnt++] = f;
}
}
cout << cnt << endl;
for(int i = 0; i < cnt; ++i){
cout << id[i] << " ";
}
cout << endl;
return 0;
}