Codeforces Global Round 7 (A~D)

昨晚没报上名导致没打,不过我这菜鸡,打不打貌似都一样......

目录

A:Bad Ugly Numbers

B:Maximums

C:Permutation Partitions

D:D1 - Prefix-Suffix Palindrome (Easy version)


A:Bad Ugly Numbers

题意:让你找出来一个n位数s,对于s的每一位,s都不是其倍数,并且不含0;

找到特殊组合即可;我找的2333333.......

#include 
using namespace std;
int main()
{
	int t,n;
	cin>>t;
	while(t--)
	{
		cin >>n;
		if(n==1) cout <<-1<

B:Maximums

题意:数列bi是数列ai减去数列ai的前缀最大值;现在给出了bi让你求ai;

首先x1=0;

 a1=x1+b1;   x2=max(x1,a1);

a2 =x2+b2;   x3=max(x2,a2);

...............

递推即可:

#include 
using namespace std;
int b[200005];
int main()
{
	int n;
	cin >>n;
	for(int i=1;i<=n;i++) cin >>b[i];
	int x=0;
	for(int i=1;i<=n;i++)
	{
			int a=x+b[i];
			cout <

C:Permutation Partitions

题意:给出一个序列,然后让你划分成k个区间,求这k个区间最大值的和的最大值;并且求出划分区间的方法数;

和的最大值就是求前k大的数;理所应当每个区间最多并且只能包含一个这k个数中的一个;所以当两个数之间的距离位为s时,那么这两个数的划分方法数是s+1;枚举连乘即可;

#include 
using namespace std;
typedef long long ll;
const int mod=998244353;
struct node 
{
	ll x,id;
}bb[200005];
map mp;
int main()
{
	int n,k;
	cin >>n>>k;
	priority_queue q;
	for(int i=0;i>bb[i].x;
		bb[i].id=i;
		q.push(bb[i].x);
	}
	ll sum=0,res=k,ans=1;
	while(res--) sum+=q.top(),mp[q.top()]=1,q.pop();
	vector v;
	for(int i=0;i

D:D1 - Prefix-Suffix Palindrome (Easy version)

题意:对于字符串s,取其前缀s1和后缀s2,然后相加构成字符串 t = s1 + s2;求t的最大长度;

原理:T + 回文  + reverse(T)

用双指针先找出来前后对应的字符;然后对于中间的字符串,求出长度最大的前缀或者后缀回文字符串;

#include 
using namespace std;
typedef long long ll;
const int mod=998244353;
string s;
bool check(int l,int r)
{
	while(l<=r&&s[l]==s[r]) l++,r--;
	return l>r;
}
int main()
{
	int t ;
	cin >>t;
	while(t--)
	{
		cin >>s;
		int l=0,r=s.size()-1;
		while(l=l;j--) if(check(l,j)) break;
		int ll , rr;
		if(r-i>j-l) rr=r,ll=i;
		else rr=j,ll=l;
		for(int i=0;i

 

你可能感兴趣的:(思维)