A 改变一个字符变成回文 统计要改变的数目 如果1个不一样是可以的 坑点是奇数的时候 可以改变中间那个
#include<stdio.h> #include<algorithm> #include<stdlib.h> #include<cstring> #include<iostream> #include<string> #include<cmath> #include<vector> #include<queue> #include<deque> #include<map> #include<iterator> #include<stack> using namespace std; #define ll __int64 #define MAXN 100 #define inf 2000000007 char z[MAXN]; int main() { scanf("%s",z); int len=strlen(z); int ok=0; int cnt=0; for(int i=0,j=len-1;i<len/2;i++,j--) if(z[i]!=z[j]) cnt++; if(cnt==1) ok=0; else ok=1; if(len==1||cnt==0&&len%2==1) printf("YES\n"); else { if(ok==0) printf("YES\n"); else printf("NO\n"); } return 0; }
B 操作是移动第一个字母到最后 使得所有的字符串相同 问最少步数暴力每个能到达的串 更新步数
#include<stdio.h> #include<algorithm> #include<stdlib.h> #include<cstring> #include<iostream> #include<string> #include<cmath> #include<vector> #include<queue> #include<deque> #include<map> #include<iterator> #include<stack> using namespace std; #define ll __int64 #define MAXN 110 #define inf 2000000007 char z[MAXN][MAXN],n1[MAXN]; int main() { int n; while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) scanf("%s",z[i]); strcpy(n1,z[1]); int len=strlen(n1); int mx=inf; int ok=0; for(int ind=0;ind<len;ind++) { int sum=0; for(int i=1;i<=n;i++) { int o1=0; for(int j=0;j<len;j++) { int k,c1,kk; for(k=j,c1=0,kk=ind;c1<len;k=(k+1)%len,c1++,kk=(kk+1)%len) if(z[i][k]!=n1[kk]) break; if(c1==len) { sum=sum+j; o1=1; break; } } if(o1==0) ok=1; } mx=min(mx,sum); } if(ok==1) printf("-1\n"); else printf("%d\n",mx); } return 0; }
C操作是改变相邻2个 变成a-b a+b 最后答案是肯定有解的 因为变2步就是 -2a 2a 至少是2一开始要求一下gcd 可能都是奇数 然后不用变就>2
然后判断 i i+1
奇数 奇数 1 1 0 2 1步
奇数 偶数 1 2 -1 3 -4 2 2步
以此类推 最后一个数有点问题
#include<stdio.h> #include<algorithm> #include<stdlib.h> #include<cstring> #include<iostream> #include<string> #include<cmath> #include<vector> #include<queue> #include<deque> #include<map> #include<iterator> #include<stack> using namespace std; #define ll __int64 #define MAXN 110000 #define inf 2000000007 int z[MAXN]; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int main() { int n; while(scanf("%d",&n)!=EOF) { int d=0; for(int i=1;i<=n;i++) { scanf("%d",&z[i]); d=gcd(d,z[i]); } if(d>1) { printf("YES\n0\n"); continue; } int ans=0; for(int i=1;i<n;i++) { int c1=0; if(z[i]%2==1) { c1++; if(z[i+1]%2==1) c1++; if(c1==1) { ans=ans+2; z[i]=z[i+1]=2; } else if(c1==2) { ans=ans+1; z[i]=z[i+1]=2; } } } if(z[n]%2==1) ans=ans+2; printf("YES\n%d\n",ans); } return 0; }
D 要求取出的下标 的对应的值的和 *2>原来的
就是 取出来下标对应值 >剩下的
先按 a排序 那么取出肯定满足a 相邻2个取大的b 那么满足b 然后最后一个讨论下
#include<stdio.h> #include<algorithm> #include<stdlib.h> #include<cstring> #include<iostream> #include<string> #include<cmath> #include<vector> #include<queue> #include<deque> #include<map> #include<iterator> #include<stack> using namespace std; #define ll __int64 #define MAXN 110000 #define inf 2000000007 struct node { int a,b,i; }c[MAXN]; bool cmp(node a,node b) { return a.a>b.a; } int ans[MAXN]; bool vis[MAXN]; int main() { int n; while(scanf("%d",&n)!=EOF) { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { scanf("%d",&c[i].a); c[i].i=i; } for(int i=1;i<=n;i++) { scanf("%d",&c[i].b); } sort(c+1,c+n+1,cmp); int cnt=1; ans[cnt++]=c[1].i; for(int i=2;i<=n;i=i+2) { if(i==n) { ans[cnt++]=c[i].i; } else { if(c[i].b>c[i+1].b) ans[cnt++]=c[i].i; else ans[cnt++]=c[i+1].i; } } printf("%d\n",cnt-1); for(int i=1;i<cnt-1;i++) printf("%d ",ans[i]); printf("%d\n",ans[cnt-1]); } return 0; }
时间: 2024-10-15 08:48:40