A题
给出n,求大于n的两个合数a和b,并且a-b = n
直接输出n的倍数即可
int n;
int main() {
cin >> n;
cout << 9*n << ' ' << 8*n << endl;
return 0;
}
B题
给出n和k两个数,给出两个数组a和b,求一个数x让a数组的每个数加上x对k取余等于b数组的数,可以进行重排序
给a和b排序,排完序再交错求x验证,求最下的x
ll a[2010],b[2010],c[2010];
int main() {
int n,k;
cin >> n >> k;
for(int i = 0; i < n; i++) cin >> a[i];
sort(a,a+n);
for(int i = 0; i < n; i++) cin >> b[i];
sort(b,b+n);
ll x,mini = k;
for(int i = 0; i < n; i++) {
int flag = 0;
x = (b[i] - a[0] + k) % k;
for(int j = 0; j < n; j++) {
int l = (j+i) % n;
if((b[l] - a[j] + k) % k != x) flag = 1;
}
if(!flag) mini = min(mini,x);
}
cout << mini << endl;
}
C题
给出一个数,让这个数的每隔k位的数都相等并且要大于等于原数的最小数
按照题意模拟一遍,判断一下是不是比原数大,比原数小的话就把从第k个数开始找一个小于9的数然后加一(找到小于9之前的数都变为0),最后再按照题意模拟一边,输出即可
int main() {
int n,k;
cin >> n >> k;
cin >> s;
strcpy(ss,s);
for(int i = 0; i < n; i++) s[i] = s[i%k];
if(strcmp(ss,s) <= 0) {
cout << n << endl << s << endl;
}
else {
int a = k-1;
while(ss[a] == '9') {
ss[a] = '0';
a--;
}
ss[a]++;
for(int i = 0; i < n; i++) ss[i] = ss[i%k];
cout << n << endl << ss << endl;
}
return 0;
}
D题
输入n 后面输入n个数 每个数代表那一列有多少个11的方块,为问最多可以用多少个12的方块覆盖
如果那一列是偶数,那就直接除以2,如果是奇数,如果隔壁列也是奇数,那么它们可以多构造一个,他们相间隔偶数列也是可以构造的。
int main() {
ll n,sum = 0,flag1 = 0,flag2 = 0,a;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> a;
sum += a/2;
if(a&1) {
if(i % 2 == 0) flag1++;
else flag2++;
}
}
cout << (sum + min(flag1,flag2)) << endl;
return 0;
}