题解:AT_arc211_a [ARC211A] Banned X 2

· · 题解

蒟蒻的第一篇 ARC T1 题解!

其实很简单,情况也比较少。

注意到如果只有一对相加等于 10 的数同时出现,答案就要加上 1

例如:

为什么这种情况答案是 1?原因很简单,如果有其他数字,必然可以通过合理的穿插使相加为 10 的数不相邻。

再注意到 5 这个数字,它与自身相加等于 10,因此要和其他数穿插放。设除 5 外的数字共有 n 个,则有 n+1 个空位可以给 5 放,所以可以判断 A_5n+1 的大小,如果 A_5 \gt n+1,答案还要加上 A_5-n-1

注意小细节即可。

ARC 此题数据太水了,放过了一些错解,所以 ARC 数据过了不一定能代表你的代码是对的。我的错解就被放过了。

Code

#include<bits/stdc++.h>
#define ull unsigned long long
#define ll long long
#define pb push_back
#define eb emplace_back
#define mkp(x,y) make_pair((x),(y))
#define pii pair<int,int>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define fir first
#define sec second
#define il inline
#define re register
#define rep(x,st,en) for(int x=st;x<=en;++x)
#define down(x,st,en) for(int x=st;x>=en;--x)
//#define mp(x,y) make_pair((x),(y))
//#define int long long
using namespace std;
int T;
int a[10];
signed main(){
    scanf("%d",&T);
    while(T--){
        ll sum=0;
        rep(i,1,9){
            scanf("%d",a+i);
            if(i!=5)sum+=a[i];//题解里设的n 
        }
        int cnt=0;
        rep(i,1,4){
            if(a[i]&&a[10-i])++cnt;
            else if(a[i]||a[10-i])cnt=114514;//有其他数字,不满足条件 
        }
        if(a[5])cnt=114514;//上面只循环到4,判断一下5 
        ll ans=0;
        if(cnt==1)++ans,++sum;//似乎++sum没什么用? 
        if(a[5]>sum+1)ans+=a[5]-sum-1;//5的个数过多 
        printf("%lld\n",ans);//输出 
    }
    return 0;//结束 
}
/*

由于ARC数据太水了,给几组曾经让我的代码出错的hack 

Hacks:
#1
1
0 1 0 0 0 0 1 3 0

0
#2
1
0 0 0 1 1 1 0 0 0

0
*/ 

AC Submission

感谢 @clo201111 hack 了我曾经的错解。