分析:把串反转,判不一样的个数,不同个数恰好为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 }
B题
分析:如果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 }
时间: 2024-10-09 05:53:04