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 <bits/stdc++.h>
using namespace std;
int main()
{
	int t,n;
	cin>>t;
	while(t--)
	{
		cin >>n;
		if(n==1) cout <<-1<<endl;
		else
		{
			cout <<2;
			n--;
			while(n--) cout <<3;
			cout <<endl;
		}
	}
	 
}

B:Maximums

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

首先x1=0;

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

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

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

递推即可:

#include <bits/stdc++.h>
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 <<a<<" ";
			x=max(x,a);
	}
	 
}

C:Permutation Partitions

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

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

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
struct node 
{
	ll x,id;
}bb[200005];
map<ll,int> mp;
int main()
{
	int n,k;
	cin >>n>>k;
	priority_queue<ll> q;
	for(int i=0;i<n;i++)
	{
		cin >>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<int> v;
	for(int i=0;i<n;i++) if(mp[bb[i].x]) v.push_back(bb[i].id);
	for(int i=1;i<v.size();i++) ans=ans*(v[i]-v[i-1])%mod;
	cout <<sum<<" "<<ans<<endl;
}

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

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

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

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

#include <bits/stdc++.h>
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<r&&s[l]==s[r]) l++,r--;
		int i,j;
		for(i=l;i<=r;i++) if(check(i,r)) break;
		for(j=r;j>=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<l;i++) cout <<s[i];
		for(int i=ll;i<=rr;i++) cout <<s[i];
		for(int i=r+1;i<s.size();i++) cout <<s[i];
		cout <<endl; 
	}
}
发布了221 篇原创文章 · 获赞 54 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_43872728/article/details/104988749