[Atcoder Grand Contest 003] Tutorial

Link:

AGC003 传送门

A:

判断如果一个方向有,其相反方向有没有即可

#include <bits/stdc++.h>

using namespace std;
char s[1005];
map<char,bool> mp;
int main()
{
    scanf("%s",s);
    for(int i=0;i<strlen(s);i++) mp[s[i]]=true;
    if(mp['S']==mp['N']&&mp['E']==mp['W']) puts("Yes");
    else puts("No");
    return 0;
}
Problem A

B:

贪心最大化利用即可

#include <bits/stdc++.h>

using namespace std;
int n,dat[100005];
long long res=0;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&dat[i]);
    for(int i=1;i<=n-1;i++)
    {
        res+=dat[i]/2;dat[i]%=2;
        if(dat[i+1]>dat[i]) dat[i+1]-=dat[i],res+=dat[i];
    }
    res+=dat[n]/2;
    printf("%lld",res);
    return 0;
}
Problem B

C:

可以将两个操作转换为:

1、交换两个相邻的数

2、交换两个中间相间一个的数

由于只要求操作1的最小数,可以发现调整好所有数的序号的奇偶性就能用操作2完成任务

因此求出原序号为奇数,排序后序号为偶数的数的个数即可(原偶现奇的个数与其相同)

#include <bits/stdc++.h>

using namespace std;
int n,dat[100005],id[100005];

bool cmp(int a,int b)
{return dat[a]<dat[b];}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&dat[i]),id[i]=i;
    sort(id+1,id+n+1,cmp);
    int res=0;
    for(int i=1;i<=n;i++)
        if((id[i]&1)&&!(i&1)) res++;
    printf("%d",res);
    return 0;
}
Problem C

猜你喜欢

转载自www.cnblogs.com/newera/p/9285356.html