A. Brain’s Photos(Codefoeces 707A)
思路
遍历像素块儿,如果发现彩色像素的话题给“图片”就是彩色的,否则就是黑白的。
代码
#include <bits/stdc++.h>
using namespace std;
bool ok = true;
char s[10];
int n, m;
int main() {
scanf("%d%d", &n, &m);
for(int i = 0; i < n * m; i++) {
scanf("%s", s);
if(s[0] == 'C' || s[0] == 'M' || s[0] == 'Y') {
ok = false;
}
}
puts(ok ? "#Black&White" : "#Color");
return 0;
}
B. Bakery(Codeforces 707B)
思路
最优的情况下,选择的烘培屋和货源地一定是相邻的(若不相邻则一定能找到更优的情况),否则就无解。于是枚举图的边,若当前边所连两点分别是烘焙屋和货源地的话就用边权更新最小值 ans 。枚举结束后的 ans 就是最优解。(以下代码用排序代替枚举)
代码
#include <bits/stdc++.h>
using namespace std;
struct edge {
int u, v, w;
edge() {}
edge(int u, int v, int w): u(u), v(v), w(w) {}
bool operator < (const edge& o) const {
return w < o.w;
}
};
const int maxn = 1e5 + 5, maxm = 1e5 + 5;
bool f[maxn];
int n, m, k, u, v, w, ans;
edge edges[maxm];
int main() {
scanf("%d%d%d", &n, &m, &k);
for(int i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &w);
edges[i] = edge(u, v, w);
}
while(k--) {
scanf("%d", &u);
f[u] = true;
}
ans = -1;
sort(edges, edges + m);
for(int i = 0; i < m; i++) {
edge e = edges[i];
if(f[e.u] != f[e.v]) {
ans = e.w;
break;
}
}
printf("%d\n", ans);
return 0;
}
C. Pythagorean Triples(Codeforces 707C)
思路
这题只要知道构造勾股数的方式就能解(限于本人的水平,就只能理解到这儿了)。
设 (a,b,c) 是勾股数,
当
a
为大于
当
a
为大于
代码
#include <bits/stdc++.h>
using namespace std;
long long n;
int main() {
cin >> n;
if(n % 2 == 1) {
if(n == 1) {
cout << -1;
}
else {
n = (n - 1) / 2;
cout << 2 * n * n + 2 * n << ' ' << 2 * n * n + 2 * n + 1;
}
}
else {
if(n == 2) {
cout << -1;
}
else {
n = n / 2;
cout << n * n - 1 << ' ' << n * n + 1;
}
}
cout << endl;
return 0;
}
D. Persistent Bookcase(Codeforces 707D)
思路
本题的棘手之处在于题目中的第4个操作。在不能改变时间的情况下,状态只能随着时间的推进而转移(一维)。现在可以改变时间,那么状态的转移目的地就不唯一了,也就是说状态的转移会出现分叉。那么状态的转移的图示就从一个数轴变成了一棵树(二维)。如果我们能够构造出这棵树,就能在用 DFS 状态转移的同时计算出每个状态下的书本的数量了。
令询问
i
的时刻为
当然,要在状态转移的过程中计算出书本的数量也并非十分容易的事。关键就在于怎么表示状态。设时刻
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010, maxq = 1e5 + 5;
bool inv[maxn], B[maxn][maxn];
int n, m, q, k, res;
int o[maxq], a[maxq], b[maxq], ans[maxq], num[maxn];
vector <int> G[maxq];
void dfs(int u) {
ans[u] = res;
for(int i = 0; i < G[u].size(); i++) {
int v = G[u][i], x = a[v], y = b[v];
int pnum = num[x];
int pinv = inv[x];
int pB = B[x][y];
int pres = res;
if(o[v] == 1 && B[x][y] ^ inv[x] == 0) {
B[x][y] ^= 1;
num[x]++;
res++;
}
if(o[v] == 2 && B[x][y] ^ inv[x] == 1) {
B[x][y] ^= 1;
num[x]--;
res--;
}
if(o[v] == 3) {
res += m - 2 * num[x];
num[x] = m - num[x];
inv[x] ^= 1;
}
dfs(v);
num[x] = pnum;
inv[x] = pinv;
B[x][y] = pB;
res = pres;
}
}
int main() {
scanf("%d%d%d", &n, &m, &q);
for(int i = 1; i <= q; i++) {
scanf("%d", &o[i]);
if(o[i] <= 2) {
scanf("%d%d", &a[i], &b[i]);
G[i-1].push_back(i);
}
else if(o[i] == 3) {
scanf("%d", &a[i]);
G[i-1].push_back(i);
}
else {
scanf("%d", &k);
G[k].push_back(i);
}
}
dfs(0);
for(int i = 1; i <= q; i++) {
printf("%d\n", ans[i]);
}
return 0;
}
(其它题目略)