A. Launch of Collider
找最近的R和L之间的距离
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <vector> #include <iomanip> #include <math.h> #include <map> using namespace std; #define FIN freopen("input.txt","r",stdin); #define FOUT freopen("output.txt","w",stdout); #define INF 0x3f3f3f3f #define INFLL 0x3f3f3f3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long LL; typedef pair<int, int> PII; using namespace std; const int maxn = 200000 + 5; char s[maxn]; int a[maxn]; int main() { //FIN int n; while(~scanf("%d", &n)) { scanf("%s", s + 1); int ans = INF; for(int i = 1; i <= n; i++) scanf("%d", &a[i]); int flag = 0; for(int i = 1; i <= n; i++) { if(flag != 0) { if(s[i] == 'R') flag = i; else if(s[i] == 'L') ans = min(ans, a[i] - a[flag]); } else if(s[i] == 'R') flag = i; else continue; } if(ans == INF) printf("-1 "); else printf("%d ", ans/2); } return 0; }
B. One Bomb
*是墙问可不可以用一个炸弹把所有的墙炸掉
炸弹可以炸当前坐标上x,y轴上的所有点 (就是一个十字
直接在读取数据时维护一个前缀然后再扫一遍判断就可以了
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <vector> #include <iomanip> #include <math.h> #include <map> using namespace std; #define FIN freopen("input.txt","r",stdin); #define FOUT freopen("output.txt","w",stdout); #define INF 0x3f3f3f3f #define INFLL 0x3f3f3f3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long LL; typedef pair<int, int> PII; using namespace std; const int maxn = 1000 + 5; int q1[maxn]; int q2[maxn]; char mp[maxn][maxn]; int main() { //FIN int n, m; while(~scanf("%d%d", &n, &m)) { int cnt = 0; memset(q1, 0, sizeof(q1)); memset(q2, 0, sizeof(q2)); for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { cin >> mp[i][j]; if(mp[i][j] == '*') { cnt++; q1[i]++; q2[j]++; } } } int flag = 0; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { int tmp = cnt; if(mp[i][j] == '*') tmp++; if(q1[i] + q2[j] == tmp) { printf("YES "); printf("%d %d ", i+1, j+1); flag = 1; break; } } if(flag) break; } if(flag == 0) printf("NO "); } return 0; }
C. Vacations
1 2 代表两种活动 3表示两种活动都可以进行 0是休息 不可以连续两天进行同一个活动,问最少休息的天数是多少, 贪心
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <vector> #include <iomanip> #include <math.h> #include <map> using namespace std; #define FIN freopen("input.txt","r",stdin); #define FOUT freopen("output.txt","w",stdout); #define INF 0x3f3f3f3f #define INFLL 0x3f3f3f3f3f3f3f #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 typedef long long LL; typedef pair<int, int> PII; using namespace std; const int maxn = 100 + 5; int a[maxn]; int main() { //FIN int n; while(~scanf("%d", &n)) { for(int i = 1; i <= n; i++) scanf("%d", &a[i]); int flag = -1; int ans = 0; for(int i = 1; i <= n; i++) { if(a[i] == 0) ans++, flag = -1; else if(a[i] == 1) { if(flag != 1) flag = 1; else flag = -1, ans++; } else if(a[i] == 2) { if(flag != 2) flag = 2; else flag = -1, ans++; } else { if(flag == 1) flag = 2; else if(flag == 2) flag = 1; //else if(a[i+1] == 1) flag = 2; //else flag = 1; } } printf("%d ", ans); } return 0; }