传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3721
一开始毫无思路,然后打了个暴力
显然要取奇数个奇数的,偶数的随便取,然后就是取几个的问题,显然确定了取的奇偶个数后肯定会选最大的前几个
暴力如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e6+10;
LL A[maxn],B[maxn],f[maxn];
int a[maxn],b[maxn];
int getint(){
int res=0,f=1;char c=getchar();
while(!isdigit(c))f=f==-1||c=='-'?-1:1,c=getchar();
while(isdigit(c))res=(res<<1)+(res<<3)+c-'0',c=getchar();
return res*f;
}
void putint(LL x){
if(x<0)putchar('-'),x=-x;
if(x<10){
putchar(x+'0');
}else{
putint(x/10);
putchar(x%10+'0');
}
}
int n,m;
int main(){
n=getint();
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
if(x&1)A[++A[0]]=x;
else B[++B[0]]=x;
}sort(A+1,A+1+A[0],greater<LL>());
sort(B+1,B+1+B[0],greater<LL>());
for(int i=2;i<=A[0];i++)A[i]+=A[i-1];
for(int i=2;i<=B[0];i++)B[i]+=B[i-1];
m=getint();
for(int j=1;j<=m;j++){
int x=getint();
LL ans=-1;
for(int i=1;i<=A[0];i+=2){
if(x-i>=0&&x-i<=B[0]){
ans=max(ans,A[i]+B[x-i]*(x-i>0));
f[j]=i;
}
}
}
for(int i=1;i<=m;i++)printf("%d\t",f[i]);
return 0;
}
按顺序打出来决策值之后发现了决策居然是单调的!!!!!
而且排除了-1的情况外,从小往大,决策要么不下降,要么是上个非-1决策的值+2,
然后就喜闻乐见的敲出了标程(这是标算吗= =、 )
Code;
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e6+10;
LL A[maxn],B[maxn],f[maxn];
int cur=1;
int n,m;
int getint(){
int res=0;char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))res=(res<<1)+(res<<3)+c-'0',c=getchar();
return res;
}
void putint(LL x){
if(x<0)putchar('-'),x=-x;
if(x<10){
putchar(x+'0');
}else{
putint(x/10);
putchar(x%10+'0');
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x=getint();
if(x&1)A[++A[0]]=x;
else B[++B[0]]=x;
}sort(A+1,A+1+A[0],greater<LL>());
sort(B+1,B+1+B[0],greater<LL>());
for(int i=2;i<=A[0];i++)A[i]+=A[i-1];
for(int i=2;i<=B[0];i++)B[i]+=B[i-1];int Bz=B[0];B[0]=0;
f[1]=A[0]?A[1]:-1;
for(int i=2;i<=n;i++){
f[i]=-1;
//f[i]=max(A[cur]+B[i-cur]*(i-cur>0),A[cur+2]+B[i-cur-2]*(i-cur-2>0));
if(i-cur>=0&&i-cur<=Bz&&cur<=A[0])
f[i]=A[cur]+B[i-cur];
if(i-cur-2>=0&&i-cur-2<=Bz&&cur+2<=A[0]&&f[i]<=A[cur+2]+B[i-cur-2]){
f[i]=A[cur+2]+B[i-cur-2];
cur+=2;
}
}scanf("%d",&m);
while(m--){
int x=getint();
printf("%lld\n",f[x]);
}
return 0;
}