A. Bear and Game(Codefoeces 673A)
思路
检查每两个有趣时间点,若之间的间隔超过 15 分钟的话就按照 15 分钟算并结束检查时间,否则按照实际间隔时间算。将所有间隔时间累加起来就得到了最终答案。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100;
int n, ans, a[maxn];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
a[n+1] = ans = 90;
for(int i = 1; i <= n + 1; i++) {
if(a[i] - a[i-1] > 15) {
ans = a[i-1] + 15;
break;
}
}
printf("%d\n", ans);
return 0;
}
B. Problems for Round(Codefoeces 673B)
思路
如果
3
和
代码
#include <bits/stdc++.h>
using namespace std;
int n, m, l, r, ml, mr;
int main() {
scanf("%d%d", &n, &m);
ml = 1;
mr = n;
while(m--) {
scanf("%d%d", &l, &r);
if(l > r) {
swap(l, r);
}
ml = max(ml, l);
mr = min(mr, r);
}
printf("%d\n", mr - ml < 0 ? 0 : mr - ml);
return 0;
}
C. Bear and Colors(Codefoeces 673C)
思路
暴力枚举所有区间 [i,j] 。当计算完区间 [i,j] 时,可以通过常数时间计算区间 [i,j+1] 。区间 [i,j+1] 和区间 [i,j+2] 同理。因此就不用再计算每个 [i,j] 时重新统计区间中的颜色个数了。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005;
int n, m, cur, t[maxn], cnt[maxn], ans[maxn];
int main() {
scanf("%d", &n);
for(int i = 0; i < n; i++) {
scanf("%d", &t[i]);
}
memset(ans, 0, sizeof(ans));
for(int i = 0; i < n; i++) {
memset(cnt, 0, sizeof(cnt));
m = 0;
for(int j = i; j < n; j++) {
cnt[t[j]]++;
if(cnt[t[j]] > m) {
m = cnt[t[j]];
cur = t[j];
}
if(cnt[t[j]] == m && t[j] < cur) {
cur = t[j];
}
ans[cur]++;
}
}
for(int i = 1; i <= n; i++) {
printf("%d ", ans[i]);
}
puts("");
return 0;
}
D. Bear and Two Paths(Codefoeces 673D)
思路
这是个构造问题,所以我们应寻找一种特殊形式来符合题目要求。将图构造成如下形式就行了。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int n, k, s1, s2, t1, t2, m[maxn];
int main() {
cin >> n >> k >> s1 >> t1 >> s2 >> t2;
if(n == 4 || k <= n) {
puts("-1");
return 0;
}
m[s1] = m[t1] = m[s2] = m[t2] = 1;
printf("%d %d ", s1, s2);
for(int i = 1; i <= n ;i++) {
if(m[i] == 0) {
printf("%d ", i);
}
}
printf("%d %d\n", t2, t1);
printf("%d %d ", s2, s1);
for(int i = 1; i <= n; i++) {
if(m[i] == 0) {
printf("%d ", i);
}
}
printf("%d %d\n", t1, t2);
return 0;
}
(其它题目略)