欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

AtCoder Beginner Contest 160(A~D)

程序员文章站 2022-06-22 08:59:35
A - Coffee 题意:给你一个字符串,要你判断是否满足一下条件,全部满足则输出“Yes”,否则输出“No”。 (1)字符串的第3个字母等于字符串的第4个字母 (2)字符串的第5个字母等于字符串的第6个字母 (3)字符串的长度为6,且全部为小写字母 题解:签到题,易解 代码: #include< ......

a - coffee

题意:给你一个字符串,要你判断是否满足一下条件,全部满足则输出“yes”,否则输出“no”。

  (1)字符串的第3个字母等于字符串的第4个字母

  (2)字符串的第5个字母等于字符串的第6个字母

  (3)字符串的长度为6,且全部为小写字母

题解:签到题,易解

代码:

 

#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
#define ll long long
int main(){    
    string ptr;
    cin>>ptr;
    int f=1;
    for(int i=0;i<ptr.length();i++){
        if(ptr[i]>='a'&&ptr[i]<'z'){
            f=0;
            break;
        }
    }
    if(f==0){
        cout<<"no"<<endl;
        return 0;
    }
    if(ptr.length()==6){
        if(ptr[2]==ptr[3]&&ptr[4]==ptr[5]){
            cout<<"yes"<<endl;
        }else{
            cout<<"no"<<endl;
        }
    }else{
        cout<<"no"<<endl; 
    }
    return 0;
}

 

b - golden coins

题解:是一个简单的贪心题,也属于签到题

代码:

#include<iostream>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
#define ll long long
int main(){    
    ll mo;
    cin>>mo;
    ll sum=0;
    ll n1=mo/500;
    ll n2=(mo%500)/5;
    sum=n1*1000+n2*5;
    cout<<sum<<endl;
    return 0;
}

c - traveling salesman around lake

题意:大概意思就是存在一个周长为k的圆,在它的周边分布着n个点,分布分别距离圆的最北端的激距离分别为ai,由下面的n个数给出

题解:这一题其实比较简单,你将这个圆分为n-1段,将他们的的和,然后遍历舍去某一段,取它的最小值即可,

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll num[200010]={0};
int main(){
    ll k,n;
    cin>>k>>n;
    memset(num,0,sizeof(num));
    for(int i=0;i<n;i++){
        cin>>num[i];
    }
    sort(num,num+n);
    if(n==1){//只有一个 
        cout<<0<<endl;
    }else if(n==2){//有两个
        ll len=num[n-1]-num[0];
        cout<<min(len,k-len)<<endl; 
    }else{//至少有三个及以上
        ll min_l=10000000;
        ll len[200010]={0},t=0;
        ll sum=0;
        for(int i=1;i<n;i++){
            len[t++]=num[i]-num[i-1];
            sum=sum+len[t-1];
        }
        len[t++]=k-num[n-1]+num[0];
        sum=sum+len[t-1];
        for(int i=0;i<t;i++){//丢掉第  i  个数 
            min_l=min(min_l,sum-len[i]);
        }
        cout<<min_l<<endl;
    }
    return 0;
}

d - line++

题意:这一题大概是讲存在n个顶点,从1~n相邻两个顶点之间存在一条边,给出x、y,这两个顶点也存在一条边,令k=1,2,3,4,,,,n-1,求两个点之间的最短距离为k对数

题解:这里可以讲每两个点的距离分为两种情况:经过x,y;不经过x,y,就可以分别求出每一对的距离,取这两者的最小值,然后用桶来给每中距离计数即可

代码:

 

#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll s[2005][2005];
ll ans[2005*2005]={0};
int main(){
    ll n,x,y;
    cin>>n>>x>>y;
    ll a=x,b=y;
    x=min(a,b);
    y=max(a,b);
    for(ll i=1;i<=n;i++){
        for(ll j=i+1;j<=n;j++){
            s[i][j]=min(j-i,abs(x-i)+abs(y-j)+1);
        }
    }
    
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            ans[s[i][j]]++;
        }
    }
    for(int i=1;i<n;i++){
        cout<<ans[i]<<endl;
    }
    return 0;
}