Codeforces Round #618 (Div. 2)

A

题意:

数组和and积为不能为0

思路:

不能出现0,以及和不能是0

所有最后就是零的个数,如果零的个数+数组和==0的情况需要再加一

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define inf 0x3f3f3f3f
 7 #define lowbit(x) (x)&(-x)
 8 #define mem(a,b) memset(a,b,sizeof(a))
 9 #define mod 1000000007
10 const int maxn=1510;
11 int n,m,t;
12 int main(){
13     scanf("%d",&t);
14     while(t--){
15         int sum=0,l=0;
16         scanf("%d",&n);
17         for(it i=0;i<n;i++){
18             scanf("%d",&m);
19             sum+=m;
20             if(m==0){
21                 l++;
22             }
23         }
24         if(sum+l==0){
25             l++;
26         }
27         printf("%d\n",l);
28     }
29     return 0;
30 }
View Code

B

题意:

给一个2*n的数组,分成两组,寻找中间值的最小的绝对值

思路:

就是abs(a[n/2]+a[n/2-1])的值

这里是失智的开始,re了一发

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define inf 0x3f3f3f3f
 7 #define lowbit(x) (x)&(-x)
 8 #define mem(a,b) memset(a,b,sizeof(a))
 9 #define mod 1000000007
10 const int maxn=2e5+10;
11 int n,m,t,a[maxn];
12 int main(){
13     scanf("%d",&t);
14     while(t--){
15         scanf("%d",&n);
16         n*=2;
17         for(it i=0;i<n;i++){
18             scanf("%d",&a[i]);
19         }
20         sort(a,a+n);
21         printf("%d\n",abs(a[n/2]-a[n/2-1]));
22     }
23     return 0;
24 }
View Code

 

C

题意:

给一个n的数组,给一个公式f(x,y)=x|y-y, 重新排列数组得到数组最后计算的最大值

思路:

x|y-y,就是y二进制里面的1,减去与之对于在x二进制里面的1,如果与之对于的是0,不用管,减完之后的x(二进制)就是f(x,y)的值

然后可以顺推过去,只要找到二进制里面最高位的唯一的1,就是数组最后计算的最大值,把  二进制里面最高位的唯一的1代表的数  放到第一位,就是答案

因为一度把x y当成0~10^5,记录二进制的数组只有15,一直wa,wa的心态炸裂,不相信自己最初的思路,然后开始一系列操作和猜测

最后快到结束了,回去瞄了一眼题,发现是10^9,同时,wa的过程也去看了D题,但问题过于长,加载半天,然后看不懂……(可能是C题一直卡着反正就很烦躁)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define inf 0x3f3f3f3f
 7 #define lowbit(x) (x)&(-x)
 8 #define mem(a,b) memset(a,b,sizeof(a))
 9 #define mod 1000000007
10 const int maxn=1e5+10;
11 int n,m,t,vis[30],a[maxn];
12 int main(){
13    scanf("%d",&n);
14     for(it i=0;i<n;i++){
15         scanf("%d",&a[i]);
16         int kk=a[i],ci=0;
17         while(kk){
18             if(kk%2==1){vis[ci]+=1;}
19             kk/=2;ci++;
20         }
21     }
22     int f=1,pos=0;
23     for(it i=30;i>=0;i--){
24         if(vis[i]==1){
25             pos=i;f=0;break;
26         }
27     }
28     //cout<<pos<<endl;
29     int k=1<<pos;
30     if(!f){
31         for(it i=0;i<n;i++){
32            if(a[i]&k){
33             int tt=a[0];a[0]=a[i];a[i]=tt;
34            }
35         }
36     }
37     for(it i=0;i<n;i++){
38         printf(i==n-1?"%d\n":"%d ",a[i]);
39     }
40     return 0;
41 }
View Code

 

DE待补,求别被hack,雪上加霜,这次又要掉分了

觉得自己失了智,家里网速太慢了,12分钟之后才卡进去,进去的时候A题过了4k个,B题过了1k个,就感觉很凉

但也不是这次失智的原因……C题因为将10^9看成了10^5之后,数组开了一个15,(应该开30的)然后wa了8发以后,重新读题之后发现了自己失智的情况。这题跟没做一样了

导致DE没有时间理解去做。

update:

D

题意:

给一组点,必定是凸的多边形p,是否能平移到以(0,0)中心点,形成一个相似于p的多边形

思路:

p是原点对称图形就是YES,反之就是NO

奇数点就是NO

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define inf 0x3f3f3f3f
 7 #define lowbit(x) (x)&(-x)
 8 #define mem(a,b) memset(a,b,sizeof(a))
 9 #define mod 1000000007
10 const int maxn=1e5+10;
11 int n,m,t,a[maxn][2];
12 int main(){
13    scanf("%d",&n);
14    it f=1;if(n&1){f=0;}
15    for(it i=0;i<n;i++){
16         scanf("%d%d",&a[i][0],&a[i][1]);
17    }
18    if(!f){printf("NO\n");}
19    else{
20         int posx=a[0][0]+a[n/2][0],posy=a[0][1]+a[n/2][1];
21         for(it i=1;i<n/2;i++){
22             int xx=a[i][0]+a[n/2+i][0],yy=a[i][1]+a[n/2+i][1];
23             if(xx!=posx || yy!=posy){f=0;break;}
24         }
25         if(!f){printf("NO\n");}
26         else{printf("YES\n");}
27    }
28     return 0;
29 }
View Code

 

update2:

E:https://www.cnblogs.com/luoyugongxi/p/12293261.html

posted @ 2020-02-10 00:33  ouluy  阅读(135)  评论(0编辑  收藏  举报