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

 

posted @ 2017-04-25 10:56  wolf940509  阅读(139)  评论(0编辑  收藏  举报