A. Download More RAM
贪心,依次找最小的
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
int a,b;
}g;
bool cmp(g a1,g a2)
{
return a1.a<a2.a;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
g v[200];
int now=k;
for(int i=1;i<=n;i++)
{
cin>>v[i].a;
}
for(int i=1;i<=n;i++)
{
cin>>v[i].b;
}
sort(v+1,v+n+1,cmp);
for(int i=1;i<=n;i++)
{
if(now<v[i].a)break;
if(now>=v[i].a)now+=v[i].b;
}
cout<<now<<endl;
}
}
B. GCD Arrays
由于是连续数字,偶数必有公因数2,每次操作删除一个奇数即可,问题转化为“求所给区间奇数个数”,特殊情况l==r==1的时候始终不行
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
long long int l,r,k;
cin>>l>>r>>k;
if(l==r&&l>=2)cout<<"YES\n";
else
{
long long int len=r-l+1;
if(l%2&&r%2)len++;
if(k>=len/2)cout<<"YES\n";
else cout<<"NO\n";
}
}
}
C. Meximum Array
Problem - C - Codeforces
所求b数组是字典序最大的,所以优先考虑a数组整个的mex
找到mex之后再把mex值等于当前串的最短字串的长度求出来为minnum。
删掉这前minnum个数,再重复操作
#include<bits/stdc++.h>
using namespace std;
int r1[200500],r2[200500];
int mex;
vector<int>v,b;
int main()
{
int t;cin>>t;
while(t--)
{
memset(r1,0,sizeof(r1));
int n;
int minnum=0;
cin>>n;
v.clear();
b.clear();
for(int i=0;i<n;i++)
{
int num;cin>>num;
v.push_back(num);
r1[num]++;
}
mex=0;
while(r1[mex])mex++;//mex(a)
for(int i=0;i<v.size();i++)
{
if(v[i]<mex)
{
if(r2[v[i]]==0)minnum++;
r2[v[i]]++;
}
if(minnum==mex)
{
b.push_back(mex);
for(int j=0;j<=mex;j++)r1[j]-=r2[j];
mex=0;
while(r1[mex])mex++;//mex(a)
minnum=0;
memset(r2,0,sizeof(r2));
}
}
cout<<b.size()<<endl;
for(int i=0;i<b.size();i++)
cout<<b[i]<<" ";
cout<<endl;
}
}