这题我得到一个经验,bool型的dp一定要想办法把bool去掉来表示更多的东西(1933也是这个道理)

暴力大家都会,这里有两个限制条件

一个限制条件我们可以排序不断加入,另一个呢

我们可以用f[i]表示c[]的和等于i时,最小的b[]最大是多少

然后转移判断就很容易解决了

 1 var sum,a,b,c:array[0..1010] of longint;
 2     w,s,h,f,d:array[0..1000010] of longint;
 3     ans:array[0..1000010] of boolean;
 4     mx,i,n,j,k,q:longint;
 5 
 6 function min(a,b:longint):longint;
 7   begin
 8     if a>b then exit(b) else exit(a);
 9   end;
10 
11 function max(a,b:longint):longint;
12   begin
13     if a>b then exit(a) else exit(b);
14   end;
15 
16 procedure swap(var a,b:longint);
17   var c:longint;
18   begin
19     c:=a;
20     a:=b;
21     b:=c;
22   end;
23 
24 procedure sorta(l,r:longint);
25   var i,j,x:longint;
26   begin
27     i:=l;
28     j:=r;
29     x:=a[(l+r) shr 1];
30     repeat
31       while a[i]<x do inc(i);
32       while x<a[j] do dec(j);
33       if not(i>j) then
34       begin
35         swap(a[i],a[j]);
36         swap(b[i],b[j]);
37         swap(c[i],c[j]);
38         inc(i);
39         dec(j);
40       end;
41     until i>j;
42     if l<j then sorta(l,j);
43     if i<r then sorta(i,r);
44   end;
45 
46 procedure sortq(l,r:longint);
47   var i,j,x:longint;
48   begin
49     i:=l;
50     j:=r;
51     x:=w[(l+r) shr 1];
52     repeat
53       while w[i]<x do inc(i);
54       while x<w[j] do dec(j);
55       if not(i>j) then
56       begin
57         swap(w[i],w[j]);
58         swap(s[i],s[j]);
59         swap(h[i],h[j]);
60         swap(d[i],d[j]);
61         inc(i);
62         dec(j);
63       end;
64     until i>j;
65     if l<j then sortq(l,j);
66     if i<r then sortq(i,r);
67   end;
68 
69 begin
70   readln(n);
71   for i:=1 to n do
72     readln(c[i],a[i],b[i]);
73   sorta(1,n);
74   for i:=1 to n do
75     sum[i]:=sum[i-1]+c[i];
76 
77   readln(q);
78   for i:=1 to q do
79   begin
80     readln(w[i],h[i],s[i]);
81     d[i]:=i;
82     mx:=max(mx,h[i]);
83   end;
84   sortq(1,q);
85   j:=1;
86   f[0]:=1000000007;
87   for i:=1 to q do
88   begin
89     while (j<=n) and (a[j]<=w[i]) do
90     begin
91       for k:=min(mx,sum[j]) downto c[j] do
92         if f[k-c[j]]>0 then f[k]:=max(f[k],min(f[k-c[j]],b[j]));
93       inc(j);
94     end;
95     ans[d[i]]:=(f[h[i]]>w[i]+s[i]);
96   end;
97   for i:=1 to q do
98     if ans[i] then writeln('TAK') else writeln('NIE');
99 end.
View Code

 

posted on 2015-05-27 14:59  acphile  阅读(225)  评论(0编辑  收藏  举报