分析:把串反转,判不一样的个数,不同个数恰好为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 }
分析:暴力去匹配即可
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 }
分析:如果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 }
分析:首先,我们需要对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 }