A
遍历字符串的每个位置,判断此位置,后两个位置的三个字符是否构成red串,统计个数
#include<bits/stdc++.h> using namespace std; #define int long long #define maxx 20000 #define mod 2000000 #define INF 0x3f3f3f3f int ans; string s; signed main() { cin>>s; for(int i=0;i<s.size()-2;++i) if(s[i]=='r'&&s[i+1]=='e'&&s[i+2]=='d') ++ans; if(ans>=2) cout<<"Yes\n"; else cout<<"No\n"; }
B
递推
很明显偶字串的最大长度仅仅受到本位置,前一个位置这两个单个字符的影响,故而两个单个字符外的位置可以直接转移,定义dp[i]为以i为开头的最长偶子串长度,如果i和i+1处的字符串一致,那么可以构成最长为dp[i+2]+1的偶子串,否则不可以。
#include<bits/stdc++.h> using namespace std; #define int long long #define maxx 300000 #define mod 2000000 #define INF 0x3f3f3f3f int ans,n; int dp[maxx]; string s; signed main() { cin>>s; n=s.size(); s="0"+s; for(int i=n-1;i>=1;--i) if(s[i]==s[i+1]) dp[i]=dp[i+2]+1; for(int i=1;i<=n;++i) ans=max(ans,dp[i]); cout<<ans*2; }
C
构造方法多,以下提供一个
如果可以构造出一个符合题意的数组,那么此数组可以进行排序后变为递增的数组,此数组也符合题意,因为题目未对数组相对位置的相对大小做出要求。
故构造一个符合条件的递增数组。
首先不考虑k,构造一个1-n的排列,此排列的和是所有符合条件2中最小的,此排列的最大值也是符合条件2中最小的,如果此时这两个条件有一个大于条件1与3,那么不可能构造出。
其次从大到小依此分配x-(n+1)*n/2,贪心的将尽可能多的值分配给每一个值,即分配的值要小于前一个并且小于等于x。
分配完毕后若x大于0,说明不可能构造出,因为同时符合条件2与1的最大和x为n-k+1-k的排列,此可以被上述方法构造出,x大于此最大和,自然不合法。
#include<bits/stdc++.h> using namespace std; #define int long long #define maxx 200000 #define mod 2000000 #define INF 0x3f3f3f3f int n,k,x; int all[maxx]; string s; signed main() { cin>>n>>k>>x; for(int i=1;i<=n;++i) all[i]=i; if(x<(n+1)*n/2||k<n) {cout<<"-1"; return 0; } x=x-(n+1)*n/2; all[n+1]=k+1; for(int i=n;i>=1;--i) { int zeng=min(x,(all[i+1]-all[i]-1)); all[i]=all[i]+zeng; x=x-zeng; } if(x!=0) cout<<"-1"; else {for(int i=1;i<=n;++i) cout<<all[i]<<" "; } }
D
删去尽可能多的权值让图连通,即保留尽可能少的边让图连通,故而至少保留尽可能少的边,生成树有连通图中最小的边,最小生成树为边权值最小的,故而此题被转化为构造最小生成树。
另外在计算末尾0的个数的时候,是连续的0,可以取模来判断,并且有可能溢出。
#include<bits/stdc++.h> using namespace std; #define maxx 300000 #define int long long struct Edge { int u,v,w; }E[maxx]; int fa[maxx]; int n,m,ans,eu,ev,cnt; int val[maxx]; int neww,a,b,c; int ans1=0; bool cmp(Edge a,Edge b) { return a.w<b.w; } int find(int x) { while(x!=fa[x]) x=fa[x]=fa[fa[x]]; return x; } void kruskal() { sort(E+1,E+neww+1,cmp); for(int i=1;i<=neww;i++) { eu=find(E[i].u), ev=find(E[i].v); if(eu==ev)//处于一个连通图 continue; fa[ev]=eu; ans=ans+E[i].w; } } int pd(int a,int b) { __int128 w=1; __int128 d=(__int128)a*(__int128)b; for(int q=1;q<=30;++q) {w=w*10; if(d%w!=0) return q-1; } return 0; } void add(int u,int v,int w) { E[++neww].u=u; E[neww].v=v; E[neww].w=w; } signed main() { cin>>n>>m; for(int i=1;i<=n;i++) fa[i]=i; for(int i=1;i<=n;++i) cin>>val[i]; for(int i=0;i<m;i++) { cin>>a>>b; c=pd(val[a],val[b]); add(a,b,c); add(b,a,c); ans1=ans1+c; } kruskal(); cout<<ans1-ans; return 0; }