首页 > 其他 > 详细

Codeforces Round #580 (Div. 2)

时间:2019-08-19 11:45:27      阅读:108      评论:0      收藏:0      [点我收藏+]

http://codeforces.com/contest/1206

第一次rating,之前几次都是赛后补题。时间实在有点晚,打完差不多24点了,一觉醒来判后A了3道,却掉了59分,不是很懂计分规则。

主要是B题WA了4发太伤了。

技术分享图片

 

技术分享图片

技术分享图片

 

A、Choose Two Numbers

给定两个数组,各选其中一个元素使得其和不属于任意一个数组。

排序,找两个元素的最大值即可。(注意到数组中的元素大于等于1)

技术分享图片
 1 #include<iostream>
 2 #include<sstream>
 3 #include<fstream>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<iomanip>
 7 #include<cstdlib>
 8 #include<cctype>
 9 #include<vector>
10 #include<string>
11 #include<cmath>
12 #include<ctime>
13 #include<stack>
14 #include<queue>
15 #include<map>
16 #include<set>
17 #define mem(a,b) memset(a,b,sizeof(a))
18 #define random(a,b) (rand()%(b-a+1)+a)
19 #define ll long long
20 #define ull unsigned long long
21 #define e 2.71828182
22 #define Pi acos(-1.0)
23 #define ls(rt) (rt<<1)
24 #define rs(rt) (rt<<1|1)
25 #define lowbit(x) (x&(-x))
26 using namespace std;
27 const int MAXN=105;
28 int a[MAXN],b[MAXN];
29 int read()
30 {
31     int s=1,x=0;
32     char ch=getchar();
33     while(!isdigit(ch)) {if(ch==-) s=-1;ch=getchar();}
34     while(isdigit(ch)) {x=10*x+ch-0;ch=getchar();}
35     return x*s;
36 }
37 int main()
38 {
39     int n=read();
40     for(int i=1;i<=n;++i)
41     a[i]=read();
42     int m=read();
43     for(int i=1;i<=m;++i)
44     b[i]=read();
45     
46     sort(a+1,a+n+1);
47     sort(b+1,b+m+1);
48     
49     cout<<a[n]<< <<b[m]<<endl;
50     
51 }
View Code

 

B、Make Product Equal One

给定一个序列,每次操作使得一个数加一或减一使得序列中元素的乘积为1,求最少操作数。

分情况讨论,正数的个数是0、奇数还是偶数,负数的个数是0、奇数还是偶数,0的个数是否为0

出的bug有:考虑不全面,复制前面部分代码忘修改。

这是当时交的代码,缝缝补补太难看了。以后注意判断一下0和偶数的情况。

技术分享图片
  1 #include<iostream>
  2 #include<sstream>
  3 #include<fstream>
  4 #include<algorithm>
  5 #include<cstring>
  6 #include<iomanip>
  7 #include<cstdlib>
  8 #include<cctype>
  9 #include<vector>
 10 #include<string>
 11 #include<cmath>
 12 #include<ctime>
 13 #include<stack>
 14 #include<queue>
 15 #include<map>
 16 #include<set>
 17 #define mem(a,b) memset(a,b,sizeof(a))
 18 #define random(a,b) (rand()%(b-a+1)+a)
 19 #define ll long long
 20 #define ull unsigned long long
 21 #define e 2.71828182
 22 #define Pi acos(-1.0)
 23 #define ls(rt) (rt<<1)
 24 #define rs(rt) (rt<<1|1)
 25 #define lowbit(x) (x&(-x))
 26 using namespace std;
 27 const int MAXN=1e5+5;
 28 const int INF=0x7fffffff;
 29 ll read()
 30 {
 31     ll s=1,x=0;
 32     char ch=getchar();
 33     while(!isdigit(ch)) {if(ch==-) s=-1;ch=getchar();}
 34     while(isdigit(ch)) {x=10*x+ch-0;ch=getchar();}
 35     return x*s;
 36 }
 37 int main()
 38 {
 39     ll n=read();
 40     ll z=0,f=0,o=0;
 41     ll t;
 42     ll sumz=0,sumf=0;
 43     ll minz=INF,minf=INF;
 44     for(int i=1;i<=n;++i)
 45     {
 46         t=read();
 47         if(t>0) z++,sumz+=t,minz=t<minz?t:minz;
 48         else if(t==0) o++;
 49         else f++,sumf+=-t,minf=min(minf,-t);
 50     }
 51     
 52     ll ans=0;
 53     if(z==0&&f!=0)
 54     {
 55         if(f%2==1) 
 56         {
 57             if(o==0) ans=sumf-f+2;
 58             else ans=sumz-z+sumf-f+o;
 59         }
 60         else 
 61         {
 62             ans=sumf-f+o;
 63         }
 64     }
 65     else if(f==0&&z!=0)
 66     {
 67         ans=sumz-z+o;
 68     }
 69     else if(z%2==0&&f%2==0)
 70     {
 71         ans=sumz-z+sumf-f+o;
 72     }
 73     else if(z%2==1&&f%2==1)
 74     {
 75         if(o==0)
 76         {
 77             /*ans= sumz-minz-(z-1)+sumf-minf-(f-1);
 78             if(minz+1<minf+1)
 79             ans+= minz+1+minf-1;    
 80             else ans+= minz-1+minf+1;*/    
 81             ans=sumz+sumf-z-f+2;
 82         }
 83         else if(o%2==0)
 84         {
 85             ans=sumz-z+sumf-f+o;
 86         }
 87         else 
 88         {
 89             ans=sumz-z+sumf-f+o;
 90         }
 91     }
 92     
 93     else if(z%2==1&&f%2==0)
 94     {
 95         if(o==0)
 96         {
 97             //ans=sumz-z+sumf-minf-(f-1)+minf+1;
 98             ans=sumz-z+sumf-f+2;
 99         }
100         else 
101         {
102             ans=sumz-z+sumf-f+o;
103         }
104     }
105     else 
106     {
107         if(o==0)
108         {
109             ans=sumz-z+sumf-f+2;
110 
111         }
112         else 
113         {
114             ans=sumz-z+sumf-f+o;
115         }
116     }
117     cout<<ans<<endl;
118     return 0;
119 }
View Code

修改:

技术分享图片
 1 #include<iostream>
 2 #include<sstream>
 3 #include<fstream>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<iomanip>
 7 #include<cstdlib>
 8 #include<cctype>
 9 #include<vector>
10 #include<string>
11 #include<cmath>
12 #include<ctime>
13 #include<stack>
14 #include<queue>
15 #include<map>
16 #include<set>
17 #define mem(a,b) memset(a,b,sizeof(a))
18 #define random(a,b) (rand()%(b-a+1)+a)
19 #define ll long long
20 #define ull unsigned long long
21 #define e 2.71828182
22 #define Pi acos(-1.0)
23 #define ls(rt) (rt<<1)
24 #define rs(rt) (rt<<1|1)
25 #define lowbit(x) (x&(-x))
26 using namespace std;
27 const int MAXN=1e5+5;
28 const int INF=0x7fffffff;
29 ll read()
30 {
31     ll s=1,x=0;
32     char ch=getchar();
33     while(!isdigit(ch)) {if(ch==-) s=-1;ch=getchar();}
34     while(isdigit(ch)) {x=10*x+ch-0;ch=getchar();}
35     return x*s;
36 }
37 int main()
38 {
39     ll n=read();
40     ll z=0,f=0,o=0;
41     ll t;
42     ll sumz=0,sumf=0;
43     for(int i=1;i<=n;++i)
44     {
45         t=read();
46         if(t>0) z++,sumz+=t;
47         else if(t==0) o++;
48         else f++,sumf+=-t;
49     }
50     
51     ll ans=0;
52     
53     //先这样吧,头疼 
54     if(z==0&&f!=0)
55     {
56         if(f%2==1&&o==0) ans=sumz-z+sumf-f+2;
57         else ans=sumz-z+sumf-f+o;
58     }
59     else if(f==0&&z!=0)  
60     {
61         ans=sumf-f+sumz-z+o;
62     }
63     else if(z%2==0&&f%2==0)
64     {
65         ans=sumz-z+sumf-f+o;
66     }
67     else 
68     {
69         if(o==0)
70             ans=sumz-z+sumf-f+2;
71         else 
72             ans=sumz-z+sumf-f+o;
73     }
74     cout<<ans<<endl;
75     return 0;
76 }
View Code

 

C、Almost Equal

给定一个n,找到一个1~2n的(环状)排列使得任意连续n个数的和的差值不超过1 。

也就是说该环状排列中连续n个数的和只有两种可能,出现第三种数则不满足。

一开始想暴力找规律的,浪费挺多时间,其实画一下图就能想明白了:

令第1位摆1,那么第n+1位一定要摆2,因为第1到第n位的和 与 第2到n+1位的和 的差值就是第1位和第n+1位的差值,所以第n+1位一定只能摆2;

然后摆3,要么摆第2位要么摆第n+2位,但是摆第2位时,和会出现第三种数(手动模拟一下很容易发现)。因此3只能摆第n+2为,相应地4摆第2位;

然后5摆第3位,6摆第n+3位;

然后7摆第n+4位,8摆第4位;

....

还可以发现一个规律,上述这样操作,n是偶数的时候 第n+2位到第1位的和 会是第三个值,即不满足条件。

技术分享图片
 1 #include<iostream>
 2 #include<sstream>
 3 #include<fstream>
 4 #include<algorithm>
 5 #include<cstring>
 6 #include<iomanip>
 7 #include<cstdlib>
 8 #include<cctype>
 9 #include<vector>
10 #include<string>
11 #include<cmath>
12 #include<ctime>
13 #include<stack>
14 #include<queue>
15 #include<map>
16 #include<set>
17 #define mem(a,b) memset(a,b,sizeof(a))
18 #define random(a,b) (rand()%(b-a+1)+a)
19 #define ll long long
20 #define ull unsigned long long
21 #define e 2.71828182
22 #define Pi acos(-1.0)
23 #define ls(rt) (rt<<1)
24 #define rs(rt) (rt<<1|1)
25 #define lowbit(x) (x&(-x))
26 using namespace std;
27 const int MAXN=1e5+5;
28 ll a[MAXN<<1];
29 ll read()
30 {
31     ll s=1,x=0;
32     char ch=getchar();
33     while(!isdigit(ch)) {if(ch==-) s=-1;ch=getchar();}
34     while(isdigit(ch)) {x=10*x+ch-0;ch=getchar();}
35     return x*s;
36 }
37 int main()
38 {
39     int n=read();
40     if(n%2==0)
41     {
42         puts("NO");
43         return 0;
44     }
45     int cur=0;
46     for(int i=1;i<=n;++i)
47     {
48         if(i%2==1) 
49         {
50             a[i]=++cur;
51             a[n+i]=++cur;
52         }
53         else 
54         {
55             a[n+i]=++cur;
56             a[i]=++cur;
57         }
58     }
59     puts("YES");
60     for(int i=1;i<=2*n;++i)
61     cout<<a[i]<< ;
62     
63 }
View Code

 

D、Shortest Cycle

 

Codeforces Round #580 (Div. 2)

原文:https://www.cnblogs.com/wangzhebufangqi/p/11375673.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!