cf,看明白题是第一困难的事
A. Dreamoon and Ranking Collection
加入x个没有过的,且不重复的数,时1到v能顺起来,且能达到最大
#include <bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,x,cnt=0;
cin>>n>>x;
int a[110]={0};
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
for(int i=0;i<n;i++){
if(a[i]-1<=x&&i==0){
cnt+=a[i];
int arr=a[i]-1;
x-=arr;
}
else if(a[i]-1>x&&i==0){
cnt+=x;
x=0;
break;
}
if (i != 0&&a[i] - a[i - 1] - 1 <= x) {
int cha = a[i] - a[i - 1];
cnt += cha;
if (!cha)
x -= cha;
else
x = x - cha + 1;
} else if (i != 0&&a[i] - a[i - 1] - 1 > x) {
cnt += x;
x = 0;
break;
}
}
cnt+=x;
cout<<cnt<<endl;
}
return 0;
}
B. Dreamoon Likes Permutations
分成两半,两半的最大数也是长度,然后每一半都满足从1到最大数顺起来,然后先找出来这一些数的最大的数L,然后左一半是L个数,或者右一半是L个数两种情况,要注意左右长度相等的情况。
函数中传入一个数组:
bool judge(vectorv){}
bool judge(int a[]){}
#include<bits/stdc++.h>
using namespace std;
bool judge(vector<int>v){
sort(v.begin(),v.end());
for(int i=0;i<v.size();i++){
if(v[0]!=1)
return false;
if(i!=0&&v[i]!=v[i-1]+1)
return false;
}
return true;
}
int a[200010];
int main(){
//freopen("in","r",stdin);
int t,n;
cin>>t;
while(t--){
cin>>n;
int max=0,k=0,v1=0,v2=0;
for(int i=0;i<n;i++) {
cin >> a[i];
if(a[i]>max)
max=a[i];
}
vector<int>b,c,e,f;
for(int i=0;i<max;i++)
b.push_back(a[i]);
for(int i=max;i<n;i++)
c.push_back(a[i]);
if(judge(b)&&judge(c)){
k++;
v1=1;
}
if(n-max!=max) {
for (int i = 0; i < n - max; i++)
e.push_back(a[i]);
for (int i = n - max; i < n; i++)
f.push_back(a[i]);
if (judge(e) && judge(f)) {
k++;
v2 = 1;
}
}
cout<<k<<endl;
if(v1)
printf("%d %d\n",b.size(),c.size());
if(v2)
printf("%d %d\n",e.size(),f.size());
}
return 0;
}