SMU 2024 暑假友谊赛 2

CodeForces 1150B

思路:数据量不大,爆搜即可,注意每次都是从十字架的最上方一点开始搜

AC代码:

#include<bits/stdc++.h>
using namespace std;

char mp[55][55];
int vis[55][55];
int n;

bool judge(int x,int y){
    //cout<<x+2<<" "<<y-1<<" "<<y+1<<" "<<mp[x+1][y]<<mp[x+2][y]<<mp[x+1][y-1]<<mp[x+1][y+1]<<vis[x+1][y]<<vis[x+2][y]<<vis[x+1][y-1]<<vis[x+1][y+1]<<endl;
    if(x+2<=n && y-1>0 && y+1<=n && mp[x+1][y]=='.' && mp[x+2][y]=='.' && mp[x+1][y-1]=='.' && mp[x+1][y+1]=='.'
        && vis[x+1][y]==0 && vis[x+2][y]==0 && vis[x+1][y-1]==0 && vis[x+1][y+1]==0){
        vis[x+1][y]=1; vis[x+2][y]=1; vis[x+1][y-1]=1; vis[x+1][y+1]=1; 
        return true;
    }
    }
    return false;
}

int main(){
    cin>>n;
    getchar();
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>mp[i][j];
        }getchar();
    }
    
    int flag = 1;
    // for(int i=1;i<=n;i++)
    //     for(int j=1;j<=n;j++) vis[i][j]=0; 

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(mp[i][j]=='.' && vis[i][j]==0){
                vis[i][j]=1;
                if(!judge(i,j)) flag = 0;
            }
        }
    }
    if(flag) cout<<"YES";
    else cout<<"NO";
    return 0;
}

CodeForces 1332D

题意:找出一个矩阵,是Bob方法的输出与真正正确的输出相差为输入的k

思路:试着构建一个矩阵,按Bob的输出为0,正确的输出为k,即符合题意,一大重点就是最后的一位数为k,上方为0,左侧为k的二进制取反前在加1,以此再推出一个2x3的矩阵即满足题意

AC代码:

#include<bits/stdc++.h>
using namespace std;

int main(){
    int k;
    cin>>k;
    if(k==0) cout<<1<<" "<<1<<endl<<300000<<endl;
    else{
        int x = k;
        string s;
        while(x!=0){
            if(x%2) s += "1";
            else s += "0";
            x/=2;
        }
        //cout<<s<<endl;
        string s1 = s+"1";
        string s2;
        for(int i=0;i<s.size();i++){
            if(s[i]=='0') s2 += "1";
            else s2 += "0";
        }
        s2 += "1";

        int a=0,b=0 ;
        for(int i=0;i<s1.size();i++) if(s1[i]=='1') a += pow(2,i);
        for(int i=0;i<s2.size();i++) if(s2[i]=='1') b += pow(2,i);

        cout<<2<<" "<<3<<endl;
        cout<<a<<" "<<k<<" "<<0<<endl;
        cout<<b<<" "<<a<<" "<<k<<endl;
    }

    return 0;
}

AtCoder arc134_b

题意:成对的一个数组x,按其对一个字符串对应的位置的字符交换,问字典序最小的输出结果

思路:用二维vector数组记录每个字符在字符串中出现的位置,在处理边界条件之后对字符串进行处理

AC代码:

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    cin>>n;
    string s;
    cin>>s;
    vector ch(26,vector<int>());
    for(int i=0;i<n;i++){
        ch[(int)(s[i]-'a')].push_back(i);
    }
    int i=0,j=n-1;
    while(i<j){
        int x = 0;
        while(x<26){
            while(!ch[x].empty() && ch[x].back()>j) ch[x].pop_back();
            if(ch[x].empty() || ch[x].back()<i) x++;
            else break;
        }
        if(s[i]<='a'+x){
            i++;
            continue;
        }
        j = ch[x].back();
        swap(s[i],s[j]);
        i++;j--;
    }
    cout<<s<<endl;
    return 0;
}

AtCoder abc278_d

思路:用一个queue储存x,然后分情况操作数组元素即可

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long

const int MA = 9999999999;

int N;
int arr[200005];
int vis[200005];
queue<int> gai;
int Q;
int a,b,c;
int ty = MA;
signed main(){
    cin>>N;
    for(int i=1;i<=N;i++) cin>>arr[i];
    cin>>Q;
    while(Q--){
        cin>>a>>b;
        if(a==1){
            ty=b;
            while(!gai.empty()){
                vis[gai.front()]=0;
                gai.pop();
            }
        }
        else if(a==2){
            cin>>c;
            if(ty==MA) arr[b]+=c;
            else if(vis[b]==0 && ty!=MA){
                vis[b]=1;
                gai.push(b);
                arr[b]=ty+c;
            }
            else if(ty!=MA && vis[b]==1){
                arr[b]+=c;
            }
        }
        else if(a==3){
            if(vis[b]==0 && ty==MA) cout<<arr[b]<<endl;
            else if(vis[b]==0 && ty!=MA) cout<<ty<<endl;
            else if(vis[b]==1 && ty!=MA) cout<<arr[b]<<endl;
        }
    }
    return 0;
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值