E.L-Covering Checker

题意:给定n×m的网格,UDLR分别是L型瓦片中心的上下左右,且右上角必须有且只有一个'.'

分析:用b数组记录瓦片中心四周有几块,然后模拟即可

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void sol(){
    int n,m;cin>>n>>m;
    char a[n+10][m+10];int b[n+10][m+10];
    memset(b,0,sizeof(b));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    } 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='U'){
                if(i-1==0){
                    cout<<"No"<<endl;return;
                }
                b[i-1][j]+=1;
            }
            else if(a[i][j]=='D'){
                if(i+1==n+1){
                    cout<<"No"<<endl;return;
                }
                b[i+1][j]+=1;
            }
            else if(a[i][j]=='L'){
                if(j-1==0){
                    cout<<"No"<<endl;return;
                }
                b[i][j-1]+=1;
            }
            else if(a[i][j]=='R'){
                if(j+1==m+1){
                    cout<<"No"<<endl;return; 
                }
                b[i][j+1]+=1;
            }
            else if(a[i][j]=='.'&&(i!=1||j!=m)){
                cout<<"No"<<endl;return;
            }
        }
    } 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(i==1&&j==m&&a[i][j]!='.'){
                cout<<"No"<<endl;return;
            }
            if((i!=1||j!=m)&&a[i][j]=='.'){
                cout<<"No"<<endl;return;
            }
        }
    } 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='C'){
                if(b[i][j]!=2){
                    cout<<"No"<<endl;return;
                }
            }
            else{
                if(b[i][j]!=0){
                    cout<<"No"<<endl;return;
                }
            }
        }
    }
    cout<<"Yes"<<endl; 
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t;cin>>t;
    while(t--)sol();
    return 0;
}
​

H.GG and YY's Stone Game

题意:G和Y在一堆大小为n的石子上玩游戏,G先手,每人只能拿一到两个石子,不能拿的一方输。判断G胜负,以及胜方最后得到的棋子数v

分析:如果n%3==0,G拿i个,只要Y拿3-i个即可获胜。因为G不能胜利,所以G会贪心,G会拿n×2/3

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void sol(){
    ll n;cin>>n;
    if(n%3!=0){
        cout<<"0 "<<n/3+n%3<<endl;
    }
    else{
        cout<<"1 "<<n/3<<endl;
    } 
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t;cin>>t;
    while(t--)sol();
    return 0;
}
​

L.Beef Tripe in Soup Pot?

题意:有辣锅和清汤锅,第i种食材的烹饪时间分别表示ai和bi,如果可以放到俩个锅就选择时间短的;问从辣锅和清汤锅中分别捞出食材的顺序

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
struct AA{
    ll a,b,c,d;
}A[N];
struct BB{
    ll a,idx;
}b[N];
struct CC{
    ll a,idx;
}c[N];
bool cmp(BB x,BB y){
    return x.a<y.a;
}
bool cmpp(CC x,CC y){
    return x.a<y.a;
}
void sol(){
    int n;cin>>n;
    int cntb=1,cntc=1;
    for(int i=1;i<=n;i++){
        cin>>A[i].a>>A[i].b>>A[i].c>>A[i].d;
        if(A[i].c==0&&A[i].d==1){
            c[cntc].a=A[i].b;c[cntc].idx=i;cntc++;
        }
        else if(A[i].c==1&&A[i].d==0){
            b[cntb].a=A[i].a;b[cntb].idx=i;cntb++;
        }
        else{
            if(A[i].a<A[i].b){
                b[cntb].a=A[i].a;b[cntb].idx=i;cntb++;
            }
            else{
                c[cntc].a=A[i].b;c[cntc].idx=i;cntc++;
            }
        }
    }
    sort(b+1,b+cntb,cmp);sort(c+1,c+cntc,cmpp);
    cout<<cntb-1<<" ";
    for(int i=1;i<cntb;i++)cout<<b[i].idx<<" ";cout<<endl;
    cout<<cntc-1<<" ";
    for(int i=1;i<cntc;i++)cout<<c[i].idx<<" ";
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t=1; 
    while(t--)sol();
    return 0;
}
​
Logo

欢迎大家加入成都城市开发者社区,“和我在成都的街头走一走”,让我们一起携手,汇聚IT技术潮流,共建社区文明生态!

更多推荐