解题:POI 2012 Cloakroom

题面

首先,单独处理每个询问复杂度显然不可承受,还是考虑通过排序使得限制更容易达到:按照$a$将物品排序,按照$m$将询问排序,这样肯定是要不断添加物品才能达到要求,顺着做一遍就行了

然后发现$b$的限制仍然不好满足,但是我们的可行性dp的数组只记录了是否可行,还有利用的余地,那么以$dp[i]$记录达到$i$的所有方案中最小的$b$的最大值,查询的时候就可以判定了

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=1005,M=1000005,K=100005,inf=1e9;
 6 struct a{int cc,aa,bb;}obj[N];
 7 struct b{int m,k,s,id;}qry[M];
 8 int n,T,last,dp[K],outp[M];
 9 bool cmp1(a x,a y)
10 {
11     return x.aa<y.aa;
12 }
13 bool cmp2(b x,b y)
14 {
15     return x.m<y.m;
16 }
17 int main()
18 {
19     scanf("%d",&n);
20     for(int i=1;i<=n;i++)
21         scanf("%d%d%d",&obj[i].cc,&obj[i].aa,&obj[i].bb);
22     scanf("%d",&T);
23     for(int i=1;i<=T;i++)
24         scanf("%d%d%d",&qry[i].m,&qry[i].k,&qry[i].s),qry[i].id=i;
25     sort(obj+1,obj+1+n,cmp1),sort(qry+1,qry+1+T,cmp2); dp[0]=inf,last=1;
26     for(int i=1;i<=T;i++)
27     {
28         while(last<=n&&obj[last].aa<=qry[i].m)
29         {
30             for(int j=K-1;j>=obj[last].cc;j--)
31                 dp[j]=max(dp[j],min(dp[j-obj[last].cc],obj[last].bb));
32             last++;
33         }
34         outp[qry[i].id]=(dp[qry[i].k]>qry[i].m+qry[i].s);
35     }
36     for(int i=1;i<=T;i++)
37         outp[i]?printf("TAK\n"):printf("NIE\n");
38     return 0;
39 }
View Code

 

转载于:https://www.cnblogs.com/ydnhaha/p/9841617.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值