zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    ansible使用
    git undo last commit
    metadata简介
    tinyint(4),tinyint(80)有什么区别
    php 打印debug日志
    tinycore Network card configuration during exec bootlocal.sh
    Windows使用CMD命令查看进程和终止进程
    @NotEmpty,@NotNull和@NotBlank的区别
    spring boot 程序启动缓慢的问题(二)
    LocalDateTime的一些用法
  • 原文地址:https://www.cnblogs.com/wangzhebufangqi/p/11375673.html
Copyright © 2011-2022 走看看