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;
}



京公网安备 11010502036488号