Atcoder Beginner Contest 297

文章展示了几个使用C++编写的AC代码,分别解决不同类型的问题,如找到数组中的特定间隔,判断国际象棋960开局的合法性,处理棋盘上的字母替换,计算减法操作次数以及寻找特定顺序的数字组合。这些代码涉及到数组操作,条件判断,整数模运算和集合的使用。
摘要由CSDN通过智能技术生成

A - Double Click

AC代码: 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110;
int t[N];
int main()
{
    int n,d;
    cin>>n>>d;
    for(int i=1;i<=n;i++) cin>>t[i];
    bool flag=false;
    int idx=-1;
    for(int i=2;i<=n;i++){
        if(t[i]-t[i-1]<=d){
            idx=i;
            flag=true;
            break;
        }
    }
    if(flag) cout<<t[idx]<<endl;
    else cout<<idx<<endl;
    return 0;
}

B - chess960

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int cnt1,cnt2,cnt3,cnt4,cnt5;
vector<int>a,b,c;
int main()
{
    string s;
    cin>>s;
    bool flag=true;
    for(int i=0;i<s.size();i++){
        if(s[i]=='B') a.push_back(i+1);
        if(s[i]=='R') b.push_back(i+1);
        if(s[i]=='K') c.push_back(i+1);
    }
    if(a[0]%2==a[1]%2) flag=false;
    if(c[0]>b[0]&&c[0]<b[1]&&flag) puts("Yes");
    else puts("No");
    return 0;
}

C - PC on the Table

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=110;
char s[N][N];
int h,w;
int main()
{
    cin>>h>>w;
    for(int i=1;i<=h;i++){
        for(int j=1;j<=w;j++){
            cin>>s[i][j];
        }
    }
    for(int i=1;i<=h;i++){
        for(int j=1;j<=w-1;j++){
            if(s[i][j]=='T'&&s[i][j+1]=='T'){
                s[i][j]='P';
                s[i][j+1]='C';
            }
        }
    }
    for(int i=1;i<=h;i++){
        for(int j=1;j<=w;j++){
            cout<<s[i][j];
        }
        cout<<endl;
    }
    return 0;
}

D - Count Subtractions

数据太大了,纯模拟必定超时

代码如下: 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define int long long
using namespace std;
signed main()
{
    int a,b;
    cin>>a>>b;
    int cnt=0;
    while(a!=b){
        if(a<b){
            b=b-a;
            cnt++;
        }
        else if(a>b){
            a=a-b;
            cnt++;
        }
    }
    cout<<cnt<<endl;
    return 0;
}

可以始终认定A大于B

如果AmodB等于0,那么cnt+=A/B-1

如果AmodB不等于0,那么cnt+=A/B,A=A%B

 

为什么想到整除呢?因为大的数如果减去小的数之后还是比小的数要大的话,肯定还是减去那个小的数,所以想到整除

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
int cnt;
signed main()
{
    int a,b;
    cin>>a>>b;
    while(a!=b){
        if(a<b) swap(a,b);
        if(a%b==0){
            cnt+=a/b-1;
            break;
        }
        else{
            cnt+=a/b;
            a=a%b;
        }
    }
    cout<<cnt<<endl;
    return 0;
}

E - Kth Takoyaki Set

共有N个整数,然后任意组合(同一个数可以用多次)的和,求第k小的和是多少

利用set自动升序,将一批一批的数放入set中,先将所有数都放入set中,然后接下来每一次都是将set中的第一个数(最小的数)加上原来的N个数放入set中,最后输出set中第k个数

为方便获取第k个数,可以用k次循环,然后每次删掉第一个数,k次循环后,set中的第一个数就是要求的第k小的数

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<set>
#include<vector>
#define int long long
using namespace std;
signed main()
{
    vector<int>e;
    set<int>s;
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        e.push_back(x);
    }
    sort(e.begin(),e.end());
    s.insert(0);
    while(k--){
        int x;
        for(int i=0;i<n;i++){
            x=*s.begin();
            s.insert(e[i]+x);
        }        
        s.erase(x);
    }
    cout<<*s.begin()<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值