• Codeforces Round #410 (Div. 2)


    A题

    分析:把串反转,判不一样的个数,不同个数恰好为2个或者为0个且串的长度为奇数就输出YES,否则为NO

     1 #include "iostream"
     2 #include "cstdio"
     3 #include "cmath"
     4 #include "cstring"
     5 using namespace std;
     6 string s;
     7 void Rev(string &str){
     8     int i=0,j=str.length()-1;
     9     while(i<j){
    10         swap(str[i],str[j]);
    11         i++,j--;
    12     }
    13 }
    14 int main()
    15 {
    16     while(cin>>s){
    17         string p="";
    18         for(int i=0;i<s.length();i++)
    19             p+=s[i];
    20         Rev(p);
    21         int cnt=0;
    22         int n=s.length();
    23         for(int i=0;i<n;i++){
    24             if(s[i]!=p[i])
    25                 cnt++;
    26         }
    27         if(cnt==2||((n%2)&&cnt==0))
    28             cout<<"YES"<<endl;
    29         else
    30             cout<<"NO"<<endl;
    31     }
    32 }
    View Code

    B题

    分析:暴力去匹配即可

     1 #include "iostream"
     2 #include "cstdio"
     3 #include "cstring"
     4 #include "string"
     5 using namespace std;
     6 const int maxn=55;
     7 string s[maxn];
     8 int n;
     9 void move(string &str){
    10     int len=str.length();
    11     string ss=str.substr(0,1); 
    12     str.erase(0,1);
    13     str.insert(len-1,ss);
    14 }
    15 int main()
    16 {
    17     scanf("%d",&n);
    18     for(int i=0;i<n;i++)
    19         cin>>s[i];
    20     int ans=1<<28;
    21     int flag=0;
    22     for(int i=0;i<n;i++){
    23         int cnt=0;
    24         for(int j=0;j<n;j++){
    25             int k=0;
    26             string h=s[j];
    27             while(s[i]!=h){
    28                 move(h);
    29                 cnt++;
    30                 k++;
    31                 if(k>s[i].length()){
    32                     flag=1; break;
    33                 }
    34             }
    35             if(flag) break;
    36         }
    37         if(flag)  break;
    38         ans=min(ans,cnt);
    39     }
    40     if(flag)  cout<<"-1"<<endl;
    41     else   cout<<ans<<endl;
    42 }
    View Code

    C题

    分析:如果gcd>1则直接输出YES,0.否则其他情况,我们考虑把他全变成偶数所需要的最少操作。如果a[i],a[i+1]全是奇数,则只需要一次操作即可,如果a[i],a[i+1]一奇一偶,则需要两次变化,最后直接统计即可。

     1 #include "iostream"
     2 #include "cstdio"
     3 #include "algorithm"
     4 #include "cstring"
     5 using namespace std;
     6 const int maxn=100000+10;
     7 long long a[maxn],b[maxn];
     8 int n;
     9 long long gcd(long long a,long long b){
    10     if(b==0)  return a;
    11     return gcd(b,a%b);
    12 }
    13 int main()
    14 {
    15     while(cin>>n)
    16     {
    17         cin>>a[0]>>a[1];
    18         long long g=gcd(a[0],a[1]);
    19         for(int i=2;i<n;i++){
    20             cin>>a[i];
    21             g=gcd(g,a[i]);
    22         }
    23         if(g>1){
    24             cout<<"YES"<<endl;
    25             cout<<"0"<<endl;
    26             continue; 
    27         }
    28         long long cnt=0;
    29         for(int i=0;i<n-1;i++){
    30             if(a[i]%2==0)  continue;
    31             if((a[i]%2)&&(a[i+1]%2)){
    32                 a[i]=2,a[i+1]=2;
    33                 cnt++;
    34                 continue;
    35             }
    36             cnt+=2;
    37             a[i]=2,a[i+1]=2;
    38         }
    39         if((a[n-2]%2==0)&&(a[n-1]%2))
    40             cnt+=2;
    41         cout<<"YES"<<endl;
    42         cout<<cnt<<endl;
    43     }
    44 }
    View Code

     D题

    分析:首先,我们需要对A进行排序,并维护其下标。然后因为序列的长度为奇数,我们把第一个元素加入,剩下的元素中选择b[a[i].id]和b[a[i+1].id]当中最大的加入,这样我们得到的集合中元素的和一定大于剩余元素,即满足所求。

     1 #include "iostream"
     2 #include "cstdio"
     3 #include "cstring"
     4 #include "algorithm"
     5 #include "vector"
     6 using namespace std;
     7 const int maxn=100000+10;
     8 typedef struct {
     9     long long num;
    10     int id;
    11 }Node;
    12 Node a[maxn];
    13 long long b[maxn];
    14 bool cmp(Node x,Node y){
    15     return x.num>y.num;
    16 }
    17 int n;
    18 int main()
    19 {
    20     cin>>n;
    21     for(int i=1;i<=n;i++){
    22         cin>>a[i].num;
    23         a[i].id=i;
    24     }
    25     sort(a+1,a+1+n,cmp);
    26     for(int i=1;i<=n;i++)
    27         cin>>b[i];
    28     vector<int> p;
    29     p.push_back(a[1].id);
    30     for(int i=2;i<=n;i+=2){
    31         int best=a[i].id;
    32         if(i+1<=n&&(b[a[i].id]<b[a[i+1].id]))
    33             best=a[i+1].id;
    34         p.push_back(best);
    35     }
    36     cout<<p.size()<<endl;
    37     for(int i=0;i<p.size();i++)
    38         cout<<p[i]<<" ";
    39     cout<<endl;
    40 }
    View Code
  • 相关阅读:
    linux静态链接库
    查看进程运行时间
    进程间同步-互斥量
    Linux——多线程下解决生产消费者模型
    Linux——线程
    浅谈智能指针的历史包袱
    C++ 模板基础
    用信号量为共享内存添加同步机制
    Linux——浅析信号处理
    浅析fork()和底层实现
  • 原文地址:https://www.cnblogs.com/wolf940509/p/6747328.html
Copyright © 2020-2023  润新知