比赛链接:
A题
题解:
直接统计0的个数和所有数的和,如果0的个数加上总和等于0,表示我们处理把0都变成0之外,还需要在一个正数上额外再加1 。
代码实现:
#pragma GCC optimize(2) #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #define PI atan(1.0)*4 #define E 2.718281828 #define rp(i,s,t) for (register int i = (s); i <= (t); i++) #define RP(i,t,s) for (register int i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define debug printf("ac\n"); using namespace std; inline int read() { int a=0,b=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') b=-1; c=getchar(); } while(c>='0'&&c<='9') { a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } return a*b; } const int INF = 0x3f3f3f3f; int a[105]; int main(){ int t,n; cin>>t; while(t--){ cin>>n; int sum=0,flag=0; rp(i,1,n){ cin>>a[i],sum+=a[i]; if(a[i]==0) flag=1; } // sort(a+1,a+1+n); if(sum==0&&!flag) cout<<1<<endl; else{ int cnt=0; rp(i,1,n) if(a[i]==0) cnt++; if(cnt+sum==0) cout<<cnt+1<<endl; else cout<<cnt<<endl; } } return 0; }
B题
排序后直接输出中间两个数的差值就行了。
#pragma GCC optimize(2) #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #define PI atan(1.0)*4 #define E 2.718281828 #define rp(i,s,t) for (register int i = (s); i <= (t); i++) #define RP(i,t,s) for (register int i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define debug printf("ac\n"); using namespace std; inline int read() { int a=0,b=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') b=-1; c=getchar(); } while(c>='0'&&c<='9') { a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } return a*b; } const int INF = 0x3f3f3f3f; const int N = 2e5+7; int a[N]; int main(){ int T=read(); while(T--){ int n=read(); rp(i,1,2*n) a[i]=read(); sort(a+1,a+1+2*n); printf("%d\n",abs(a[n+1]-a[n])); } return 0; }
C题
题解:
我们可以通过打表退出一个规律,每次只需要把每个数转换二进制,然后统计一下所有位中,只有一个一的位置的数,
最后先把这个位置的数输出就行,其他输出顺序不变。
代码实现:
#pragma GCC optimize(2) #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #define PI atan(1.0)*4 #define E 2.718281828 #define rp(i,s,t) for (register int i = (s); i <= (t); i++) #define RP(i,t,s) for (register int i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define debug printf("ac\n"); using namespace std; inline int read() { int a=0,b=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') b=-1; c=getchar(); } while(c>='0'&&c<='9') { a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } return a*b; } const int INF = 0x3f3f3f3f; const int N = 1e5+7; int a[N],pre[N],last[N]; int main(){ int n=read(); rp(i,1,n) a[i]=read(); int pos=-1; RP(i,32,0){ int cnt=0; rp(j,1,n) if((a[j]<<i)&1) cnt++,pos=j; if(cnt==1) break; } cout<<a[pos]<<" "; rp(i,1,n){ if(i==pos) continue; cout<<a[i]<<" "; } cout<<endl; return 0; } /* 4 0 11 6 100 0 1011 110 11 6 4 0 11 4 0 6 1011 110 100 0 1011 100 110 0 */
D题
题解:可以推出一个规律,如果这个凸包是一个中心对称图形且点数为偶数,那么输出YES,否则输出NO
然后我们可以求出中心点,然后在枚举每个点,判断是否存在与之中心对称的另一个点。
代码实现:
#pragma GCC optimize(2) #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #define PI atan(1.0)*4 #define E 2.718281828 #define rp(i,s,t) for (register int i = (s); i <= (t); i++) #define RP(i,t,s) for (register int i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define debug printf("ac\n"); using namespace std; inline int read() { int a=0,b=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') b=-1; c=getchar(); } while(c>='0'&&c<='9') { a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } return a*b; } const int INF = 0x3f3f3f3f; const int N = 1e5+7; map<pair<ll,ll>,int> H; int n; ll x[N],y[N]; int main(){ int n=read(); ll midX=0,midY=0; rp(i,1,n){ x[i]=read(),y[i]=read(); x[i]*=n,y[i]*=n; midX+=x[i]; midY+=y[i]; H[mp(x[i],y[i])]=1; } midX/=n,midY/=n; rp(i,1,n){ if(H[mp(2*midX-x[i],2*midY-y[i])]==0){ cout<<"NO"<<endl; return 0; } } cout<<"YES"<<endl; return 0; }