Atcoder 161 (A~E)

A
A题链接
根据题意模拟即可
AC代码:

#include
#include
#include
#include
#include
#include
#include
#include

typedef long long ll;
using namespace std;

int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    cout<<c<<" "<<a<<" "<<b<<endl;
    return 0;
}

B
B题链接
题意:N个物品,每个都有一个权值,询问是否存在M个物品,其中每个物品的权值不小于权值和1/4m

#include
#include
#include
#include
#include
#include
#include
#include

typedef long long ll;
using namespace std;

int main()
{
    int a[50000];
    int n,m;
    double sum=0;
    int k=0;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    sum=sum/(4*m);
    for(int i=1;i<=n;i++)
    {
        if(a[i]>=sum)
        {
            k++;
        }
    }
    if(k>=m)
    {
        cout<<"Yes";
    }
    else
    {
        cout<<"No";
    }
    return 0;
}

C
C题链接
题意:给你N和K,每次可以把N替换为N和K差的绝对值,询问所有替换中N的最小值
模拟即可
AC代码:

#include
#include
#include
#include
#include
#include
#include
#include

typedef long long ll;
using namespace std;

int main()
{
    ll a,b;
    cin>>a>>b;
    ll c=a%b;
    if(c==0)
    {
        cout<<0<<endl;
        return 0;
    }
    else
    {
        ll x=b-c;
        ll mins=min(x,c);
        cout<<mins<<endl;
    }
    return 0;
}

D
D题链接
题意:lunlun数的定义是该数字每一位与相邻位差的绝对值小于等于1,求第k小的lunlun数
题解:1~9入队列,然后进行判断如果大于0则末尾减一入队,如果小于9则可以加一入队列。
AC代码:

#include
#include
#include 
#include
#include
#include
#include
#include
#include
#include
#include 
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
using namespace std;
queue<ll> q;
int n;
int main()
{

    cin>>n;
    for(int i=1;i<=9;i++)
    {
        q.push(i);
    }
    for(int i=1;i<=n;i++)
    {

        ll pre=q.front();
        q.pop();
        if(i==n)
        {
            cout<<pre<<endl;
        }
        ll r=pre%10;
        pre=pre*10+r;
        if(r>0)
            q.push(pre-1);
        q.push(pre);
        if(r<9)
        {
            q.push(pre+1);
        }
    }

    return 0;
}

E
E题链接
题意: 给定一个字符串表示某人的工作日和休息日。只有在工作日才能工作,每次工作一天后的ccc天不能再工作。他一共要工作kkk天,问哪些天是必须工作的。
题解:先从前往后求出K个最快工作日,再从后往前求出K个最快工作日,
如果两边都参与的即为必须要做的
AC代码:

#include
#include
#include 
#include
#include
#include
#include
#include
#include
#include
#include 
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#define inf 0x3f3f3f3f
using namespace std;
int a[200020];
int b[200020];
char c[200020];
int n,k,c1;
int main()
{
    int p=0,q=0;
    int temp=99999999;
    cin>>n>>k>>c1;
    cin>>c;
    for(int i=0; i<n; i++)
    {
        if(p==k)
        {
            break;
        }
        if(c[i]=='o'&&temp>=c1)
        {
            a[p++]=i;
            temp=0;
        }
        else
        {
            temp++;
        }

    }
    temp=99999999;
    q=k-1;
    for(int i=n-1; i>=0; i--)
    {
        if(q<0)
        {
            break;
        }
        if(c[i]=='o'&&temp>=c1)
        {
            b[q--]=i;
            temp=0;
        }
        else
        {
            temp++;
        }
    }
    for(int i=0;i<k;i++)
    {
        if(a[i]==b[i])
        {
            cout<<a[i]+1<<endl;
        }
    }
    return 0;
}

你可能感兴趣的:(Atcoder)