A n个数 m 递增的 如果2个数的差大于m 那么前面的字就会消失 问最后有几个字
从后往前走一下
#include<stdio.h> #include<algorithm> #include<stdlib.h> #include<cstring> #include<iostream> #include<string> #include<cmath> #include<vector> #include<queue> #include<map> #include<iterator> #include<stack> using namespace std; #define ll __int64 #define MAXN 1010010 #define inf 2000000007 #define mod 1000000007 int z[MAXN]; int main() { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&z[i]); int cnt=1; for(int i=n-1;i>=1;i--) { if(z[i+1]-z[i]<=k) cnt++; else break; } printf("%d ",cnt); return 0; }
B 问子串中是否有26个正好是26个字母的
没有就-1 暴力
#include<stdio.h> #include<algorithm> #include<stdlib.h> #include<cstring> #include<iostream> #include<string> #include<cmath> #include<vector> #include<queue> #include<map> #include<iterator> #include<stack> using namespace std; #define ll __int64 #define MAXN 1010010 #define inf 2000000007 #define mod 1000000007 char z[MAXN]; int vis[27]; int main() { scanf("%s",z); int len=strlen(z); int ok=0; for(int i=0;i<len-25;i++) { for(int j=0;j<27;j++) vis[j]=0; for(int j=i;j<i+26;j++) { if(z[j]!='?') vis[z[j]-'A']++; } int ok1=0; int cnt=0; for(int j=0;j<26;j++) { if(vis[j]>1) ok1=1; } // printf("%d ",ok1); if(ok1==1) continue; for(int j=i;j<i+26;j++) { if(z[j]=='?') { int k; for(k=0;k<26;k++) if(vis[k]==0) break; z[j]='A'+k; vis[k]=1; } ok=1; } if(ok==1) break; } if(ok==1) { for(int i=0;i<len;i++) if(z[i]=='?') z[i]='A'; } if(ok==1) printf("%s",z); else printf("-1 "); return 0; }
C 构造序列
很烂
最后 p*n + q*n = k *k*(n+1)*(n+1)
k 可以是n 然后一直推上去 难受
#include<stdio.h> #include<algorithm> #include<stdlib.h> #include<cstring> #include<iostream> #include<string> #include<cmath> #include<vector> #include<queue> #include<map> #include<iterator> #include<stack> using namespace std; #define ll __int64 #define MAXN 1010010 #define inf 2000000007 #define mod 1000000007 ll z[MAXN],ans[MAXN]; int main() { ll n; scanf("%I64d",&n); ans[1]=2; for(ll i=2;i<=n;i++) ans[i]=i*(i+1)*(i+1)-(i-1); for(int i=1;i<=n;i++) printf("%I64d ",ans[i]); return 0; }