2021.2.20 Rating
A - A
题意:一条直线上有n个互不重合的粒子,且坐标都为偶数,每个粒子都会以每微秒1米的恒定速度向左或向右运动,求粒子碰撞的最早时刻
题解:只有在一个粒子向右,另一个粒子向左的时候才会发生碰撞
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<map> using namespace std; int a[200010]; int main(){ int n; string s; cin>>n; cin>>s; for(int i=1;i<=n;i++){ cin>>a[i]; } int flag=0; int minn=1000000000; for(int i=0;i<n&&i+1<n;i++){ if(s[i]=='R'&&s[i+1]=='L'){ minn=min((a[i+2]-a[i+1])/2,minn); flag=1; } } if(!flag){ cout<<-1<<endl; }else{ cout<<minn<<endl; } return 0; }
B - B
题意:一个nxm大小的矩形格子域。每个单元格可能是空的(“.”)或使一面墙(“*”)。如果在单元格(x,y)放置炸弹,引爆后它会摧毁x行和y列的所有墙壁。如果存在这样的单元格,输出YES和这个单元格的坐标,反之输出NO。
题解:统计所有墙的数量,对每单元格进行判断,如果这个单元格的行列的墙的数量加起来等于所有墙的数量,那么就存在,反之不存在。
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<map> using namespace std; int r[1010],c[1010]; int main(){ int n,m; int i=0,j=0; int sum=0,hang=0,lie=0; char s[1010][1010]; cin>>n>>m; for(i=0;i<n;i++){ for(j=0;j<m;j++){ cin>>s[i][j]; if(s[i][j]=='*'){ sum++; r[i]++; c[j]++; } } } int flag=0; for(i=0;i<n;i++){ for(j=0;j<m;j++){ if((s[i][j]=='*'&&r[i]+c[j]-1==sum)||(s[i][j]=='.'&&r[i]+c[j]==sum)){ flag=1; break; } } if(flag) break; } if(flag){ cout<<"YES"<<endl; cout<<i+1<<" "<<j+1<<endl; }else{ cout<<"NO"<<endl; } return 0; }

浙公网安备 33010602011771号