Atcoder ABC 166 B-D (B简单模拟, C 思维 , D 枚举) 交一发再说

B - Trick or Treat

Atcoder ABC 166 B-D (B简单模拟, C 思维 , D 枚举) 交一发再说_第1张图片
Atcoder ABC 166 B-D (B简单模拟, C 思维 , D 枚举) 交一发再说_第2张图片
Atcoder ABC 166 B-D (B简单模拟, C 思维 , D 枚举) 交一发再说_第3张图片

题意:

给你N个Snuke ,问你有哪一间Snuke是没有小吃的。

思路:

  1. 有小吃就记录一下。
  2. 最后遍历一遍就知道有几间Snuke没有小吃。

AC

#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
const int maxn=1e3+10;
int a[maxn];
int main()
{
    int n,k,d,s;
    cin>>n>>k;
    For(i,1,k)
    {
        cin>>d;
        For(j,1,d)
        {
            cin>>s;
            a[s]++;
        }
    }
    int ans=0;
    For(i,1,n)if(a[i]==0)ans++;
    cout<<ans<<endl;
    return 0;
}

C - Peaks

Atcoder ABC 166 B-D (B简单模拟, C 思维 , D 枚举) 交一发再说_第4张图片
Atcoder ABC 166 B-D (B简单模拟, C 思维 , D 枚举) 交一发再说_第5张图片
Atcoder ABC 166 B-D (B简单模拟, C 思维 , D 枚举) 交一发再说_第6张图片

题意:

给你一个图,并且每个点有权值,good点是,它是一个极大值。(连通块里只有一个点的话,它本身就是极大值)

思路1:

直接模拟。(我是先设所有点都满足,如果一个点有一次是下位点,那么就ans–,且标记一下,还要考虑高度相等的情况)

AC

#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
const int maxn=1e5+10;
int h[maxn],vis[maxn];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,m;
    cin>>n>>m;
    For(i,1,n)cin>>h[i];
    int ans=n;
    For(i,1,m)
    {
        int a,b;
        cin>>a>>b;
        if(h[a]==h[b])
        {
            if(!vis[a])ans--,vis[a]=1;
            if(!vis[b])ans--,vis[b]=1;
            continue;
        }
        if(h[a]>h[b])a=b;
        if(!vis[a])
        {
            vis[a]=1;
            ans--;
        }
    }
    cout<<ans<<endl;
    return 0;
}

思路2:(官方)

  1. 由于是极大值,就考察一个点的每个邻接点中最高的(如果有的话)和它本身的高度对比。
  2. 这里用一个数组预处理。

AC(官方)

#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
const int maxn=1e5+10;
int h[maxn];
int ma[maxn];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,m;
    cin>>n>>m;
    For(i,1,n)cin>>h[i];
    For(i,1,m)
    {
        int a,b;
        cin>>a>>b;
        ma[a]=max(ma[a],h[b]);
        ma[b]=max(ma[b],h[a]);
    }
    int ans=0;
    For(i,1,n)ans+=h[i]>ma[i];
    cout<<ans<<endl;
    return 0;
}

D - I hate Factorization

Atcoder ABC 166 B-D (B简单模拟, C 思维 , D 枚举) 交一发再说_第7张图片
Atcoder ABC 166 B-D (B简单模拟, C 思维 , D 枚举) 交一发再说_第8张图片

题意:

很明显。

思路:

枚举(1000e5也就1e15很大了,超过x了是可以接受的)

反思:

  1. contest时,以为枚举有漏洞,以为每个点都应该满足式子(事实只有一些点是满足的),不要想太多了,有了大思路,先码一遍,交一发再说

AC

#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
typedef long long ll;
ll pow(ll a)
{
    return a*a*a*a*a;
}
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    ll x,a,b;
    int flag=0;
    cin>>x;
    For(i,-200,200)
    {
        For(j,-200,200)
        {
            if(pow((ll)i)-pow((ll)j)==x)
            {
                flag=1;
                cout<<i<<' '<<j<<endl;
            }
        }
        if(flag)break;
    }
    return 0;
}

你可能感兴趣的:(Atcoder ABC 166 B-D (B简单模拟, C 思维 , D 枚举) 交一发再说)