昨晚没报上名导致没打,不过我这菜鸡,打不打貌似都一样......
目录
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;
}
}