Codeforces Round #580 (Div. 2)(A、B、C)

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

 可用Floyd算法求解最小环。

看见别人有用bfs的,先存一下

 1 #include <iostream>
 2 #include <cstring>
 3 #include <vector>
 4 #include <queue>
 5  
 6 const int N = 1e5 + 10;
 7 std::vector<int> d(N, -1);
 8 std::vector<int> p(N, -1);
 9  
10 std::vector<int> g[N];
11  
12 void bfs(int v, int &ans) {
13     std::fill(d.begin(), d.end(), -1);
14     std::fill(p.begin(), p.end(), -1);    
15  
16     std::queue<int> q;
17     q.push(v);
18     
19     d[v] = 0;
20     
21     while(!q.empty()) {
22         int v = q.front();
23         q.pop();
24  
25         for(int i = 0; i < g[v].size(); ++i) {
26             int to = g[v][i];
27             if(d[to] == -1) {
28                 d[to] = d[v] + 1;
29                 p[to] = v;
30                 q.push(to);
31             } else if(p[v] != to) {
32                 ans = std::min(ans, d[v] + d[to] + 1);
33                 return;
34             }
35             
36         } 
37  
38     }
39     
40 }
41  
42 signed main() {
43  
44         int n;
45     std::cin >> n;
46  
47     std::vector<int> cnt(66, 0);
48     std::vector<long long> a;
49     for(int i = 0; i < n; ++i) {
50         long long x; std::cin >> x;
51         if(x) a.push_back(x);
52         for(int j = 0; j < 64; ++j) {
53             if((x >> j) & 1) {
54                 cnt[j]++;    
55             }
56         }    
57     }
58  
59     for(int i = 0; i < 66; ++i) {
60         if(cnt[i] >= 3) {
61             std::cout << 3 << std::endl;
62             return 0;
63         }
64     }
65  
66     for(int i = 0; i < a.size(); ++i) {
67         for(int j = i + 1; j < a.size(); ++j) {
68             if(a[i] & a[j]) {
69                 g[i].push_back(j);
70                 g[j].push_back(i);
71             }
72         }
73     }
74  
75     int ans = 20282028;
76     for(int i = 0; i < a.size(); ++i) {
77         bfs(i, ans);
78     } 
79     
80     if(ans == 20282028) {
81         std::cout << -1 << std::endl;
82     } else {
83         std::cout << ans << std::endl;
84     }
85  
86  
87     return 0;
88 }
View Code

 

转载于:https://www.cnblogs.com/wangzhebufangqi/p/11375673.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值