Descrption
Input
Output
Sample Input
5
6 2 7
5 4 9
1 2 4
2 5 8
1 3 9
5
2 7 1
2 7 2
3 2 0
5 7 2
4 1 5
Sample Output
TAK
NIE
TAK
TAK
NIE
Hint
分析
Code
#include <bits/stdc++.h>
const int maxn=1e3+5,maxv=1e5+5,Inf=0x3f3f3f3f;
struct Nodea{
int a,b,c;
bool operator <(const Nodea &A)const{
return a<A.a;
}
}a[maxn];
struct Nodeb{
int m,k,s,id;
bool operator <(const Nodeb &b)const{
return m<b.m;
}
}b[10*maxv];
int n,m;
int f[maxv],ans[10*maxv];//f[i]表示所选满足条件物品c属性和为i,所选物品的最小的b属性值
void Init(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d%d%d",&a[i].c,&a[i].a,&a[i].b);
scanf("%d",&m);
for(int i=1;i<=m;++i){
scanf("%d%d%d",&b[i].m,&b[i].k,&b[i].s);
b[i].id=i;
}
std::sort(a+1,a+n+1);
std::sort(b+1,b+m+1);
}
void Solve(){
f[0]=Inf;
int j=1;
for(int i=1;i<=m;++i){//枚举每个询问
while(j<=n && a[j].a<=b[i].m){//枚举每个满足条件的询问
for(int k=100000;k>=a[j].c;--k)//类似背包容积
f[k]=std::max(f[k],std::min(f[k-a[j].c],a[j].b));
++j;
}
if(f[b[i].k]>b[i].m+b[i].s)//c属性之和的最大的b属性满足
ans[b[i].id]=1;
}
for(int i=1;i<=m;++i){
if(ans[i])printf("TAK\n");
else printf("NIE\n");
}
}
int main(){
Init();
Solve();
return 0;
}
原文:https://www.cnblogs.com/hbhszxyb/p/13334995.html