第一题:上车
思路:模拟
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int a[N], b[N];
int n;
int main()
{
cin >> n;
for(int i = 0; i < n; i ++) cin >> a[i] >> b[i];
int cnt = 0;
for(int i = 0; i < n; i ++){
if(b[i] - a[i] >= 2) cnt ++;
}
cout << cnt;
return 0;
}
第二题:连通分量
思路:我刚开始时用dfs做的超时了,看了题解发现是并查集,其实当时我也想到了是并查集但是我以为是二维(可能并没有这个东西)不会写就直接放弃了,结果是将二维转换为一维,学到了。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
const int N = 1010;
char g[N][N];
int p[N * N], s[N * N];
int n, m;
int find(int x){
if(p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main()
{
cin >> n >> m;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
for(int i = 0; i < n; i ++) cin >> g[i];
for(int i = 0; i < n; i ++){
for(int j = 0; j < m; j ++){
p[i * N + j] = i * N + j;
s[i * N + j] = 1;
}
}
for(int i = 0; i < n; i ++){
for(int j = 0; j < m; j ++){
if(g[i][j] == '.'){
for(int k = 0; k < 4; k ++){
int x = i + dx[k], y = j + dy[k];
if(x >= 0 && x < n && y >= 0 && y < m && g[x][y] == '.'){
int a = find(i * N + j), b = find(x * N + y);
if(a != b){
s[b] += s[a];
p[a] = b;
}
}
}
}
}
}
for(int i = 0; i < n; i ++){
for(int j = 0; j < m; j ++){
if(g[i][j] == '.') cout << ".";
else{
set<int> ans;
int sum = 1;
for(int k = 0; k < 4; k ++){
int x = i + dx[k], y = j + dy[k];
if(x >= 0 && x < n && y >= 0 && y < m && g[x][y] == '.'){
int a = find(x * N + y);
if(!ans.size() || ans.find(a) == ans.end()){
sum += s[a];
ans.insert(a);
}
}
}
cout << sum % 10;
}
}
puts("");
}
return 0;
}
第三题:信号
思路:贪心。找可以覆盖的最远的那个。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, r;
int p[N], cnt = 0;
int main()
{
cin >> n >> r;
for(int i = 1; i <= n; i ++){
int a;
cin >> a;
if(a) p[cnt ++] = i;
}
int res = 0, last = 0;
for(int i = 0; i < cnt; i ++){
if(last >= n) break;
if(p[i] - r > last){
res = -1;
break;
}
int j = i;
while(j + 1 < cnt && p[j + 1] - r <= last) j ++;
last = p[j] + r - 1;
res ++;
i = j;
}
if(last < n) res = -1;
cout << res;
return 0;
}