codeforces Round705 div2 c,d题正在更新中
A题
题意:给定一个整数n和k,要求从1-n中最多选出多少个数组成一个集合,可以让集合中数或者任意数的和不等于k;
思路:比k大的数可以选出,其与任意数的和必然不为k,那么我们来考虑小于k的数,我们只需要考虑两数之和为k,因为两个数可以拆分成其他的数之和,那么小于k的数中会有k / 2不同个数对的为k, 我们只需要选出这k / 2 个中的一个数即可, 一定要选择数对中较大的那一个数,如果我们都选择小的那个数,就可能会产生m(m > 2)个数的和为k, 例如k为10, 我们应该选择6,7,8,9, 如果选择了1,2,3, 4那么1,2,3,4的和为10就不满足题意。
#include <bits/stdc++.h>
using namespace std;
int t, n, k;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> t;
while (t -- ) {
cin >> n >> k;
int ans = 0;
ans += n - k;
ans += k / 2;
cout << ans << '\n';
for (int i = k + 1; i <= n; i ++ ) cout << i << ' ';
int m = k % 2 + k / 2;
for (int i = m; i < k; i ++ ) cout << i << ' ';
cout << '\n';
}
return 0;
}
B题
题意:在一个外星球上的时间表示法与地球上的是类似的,一天有h个小时,一个小时有m分钟,这个地球上的居民喜欢看是时钟在镜子中的反射,我们会给定一个时刻,求最近的一个合法的时刻,如果给定的时刻是合法的,那么直接输出即可。
思路:因为1 <= h <= m <= 100, 那么我们只需要枚举每个时刻,从给定时刻到(h - 1: m - 1)即可,时间合法输出即可,如果当天没有合法时刻,那么合法时刻就必然是第二天的(00:00)
1 --> 1 2 --> 5 5 --> 2, 8 --> 8, 0 – >0 其余不合法
#include <bits/stdc++.h>
using namespace std;
int t, h, m;
int a[5], b[5];
int check(int x, int y) {
a[1] = x / 10, a[2] = x % 10;
a[3] = y / 10, a[4] = y % 10;
int flag = 0;
for (int i = 1; i <= 4; i ++ ) {
if (a[i] == 1) b[5 - i] = 1;
else if (a[i] == 2) b[5 - i] = 5;
else if (a[i] == 5) b[5 - i] = 2;
else if (a[i] == 8) b[5 - i] = 8;
else if (a[i] == 0) b[5 - i] = 0;
else flag = 1;
}
if (!flag && (b[1] * 10 + b[2] < h) && (b[3] * 10 + b[4] < m)) {
printf("%d%d:%d%d\n", a[1], a[2], a[3], a[4]);
return 1;
}
return 0;
}
int main(void) {
cin >> t;
while (t --) {
scanf("%d%d", &h, &m);
int x, y;
scanf("%d:%d", &x, &y);
int flag = 0;
for (int i = y; i < m; i ++ ) {
if (check(x, i)) {
flag = 1;
break;
}
}
if (!flag)
for (int i = x + 1; i < h; i ++ ) {
for (int j = 0; j < m; j ++ ) {
if (check(i, j)) {
flag = 1;
break;
}
}
if (flag) break;
}
if (!flag) puts("00:00");
}
return 0;
}
其余题目正在更新中