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;
}
View Code

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;
}
View Code

 

posted @ 2021-02-26 18:45  Endeavo_r  阅读(53)  评论(0)    收藏  举报