[Atcoder Grand Contest 002] Tutorial

Link:

AGC002 传送门

A:

……

#include <bits/stdc++.h>

using namespace std;
int a,b;
int main()
{
    scanf("%d%d",&a,&b);
    if(a>0) puts("Positive");
    else if(a<=0&&b>=0) puts("Zero");
    else if((b-a)&1) puts("Positive");
    else puts("Negative"); 
    return 0;
}
Problem A

B:

分别用$cnt[i]$和$ok[i]$记录当前的个数以及是否可能计入答案

注意模拟时用$ok[x[i]]$来更新$ok[y[i]]$

#include <bits/stdc++.h>

using namespace std;
const int MAXN=1e5+10;
int n,m,x,y,cnt[MAXN],ok[MAXN],res;

int main()
{
    scanf("%d%d",&n,&m);
    ok[1]=1;
    for(int i=1;i<=n;i++) cnt[i]=1;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        cnt[x]--;cnt[y]++;
        if(ok[x]) ok[y]=true;
        if(ok[x]&&!cnt[x]) ok[x]=false;
    }
    
    for(int i=1;i<=n;i++) res+=ok[i];
    printf("%d",res);
    return 0;
}
Problem B

C:

又是一道构造题……

遇到输出Possible/Impossible的题目先想一想Impossible的条件是什么

对于此题,明显如果没有$dat[i]+dat[i+1]\ge  L$则无解

那么有解时从两边一路断到中间即可

#include <bits/stdc++.h>

using namespace std;
int n,l,pos,a,b;

int main()
{
    scanf("%d%d%d",&n,&l,&a);
    for(int i=2;i<=n;i++)
    {
        b=a;scanf("%d",&a);
        if(a+b>=l) pos=i-1; 
    }
    if(!pos) return puts("Impossible"),0;
    puts("Possible");
    for(int i=1;i<=pos-1;i++) printf("%d\n",i);
    for(int i=n-1;i>=pos;i--) printf("%d\n",i);
    return 0;
}
Problem C

D:

E:

F:

猜你喜欢

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