题目描述
这是一道背包模板题。有 n 个物品,第 i 个物品的价值是 ai。
有 m 次询问,每次询问给出一个整数 x,表示有一个大小为 x 的背包。你需要选出一段非空区间,使得其中的物品在价值和不大于背包大小的前提下,价值和尽可能大,请输出价值和。
输入格式
第一行,两个正整数 ,n,m,表示物品数量和询问次数。
第二行,n 个整数 ai,表示第 i 个物品的价值。
接下来 m 行,每行一个整数 x,表示询问的背包大小。
输出格式
共 m 行,每行一个整数,表示询问的答案。
特别地,如果不存在非空区间,其中的物品价值和不大于 x,则输出 No Solution
。
样例 1
输入
4 3
5 -3 -1 2
2
3
6
Copy
输出
2
3
5
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int INF=0x3f3f3f3f;
#define int long long
int n,m,a[N],x,ans;
set<int> st;
set<int>::iterator it;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]+=a[i-1];
}
while(m--){
cin>>x;
st.clear();
st.insert(0);
ans=-INF*INF;
for(int i=1;i<=n;i++){
it=st.lower_bound(a[i]-x);
if(it!=st.end()){
ans=max(ans,a[i]-*it);
}
st.insert(a[i]);
}
if(ans==-INF*INF)cout<<"No Solution"<<endl;
else cout<<ans<<endl;
}
return 0;
}