vj p1589题解

http://www.vijos.cn/Problem_Show.asp?id=1589

这题.....郁闷了首先...

第一眼认为是差分约束系统,可怜的我不会差分....后来在大牛的指点下,明白了一个道理:原来这个题是可以用贪心的哦!

以结束位点先后排序,

用v记录点i是否有西瓜

依次枚举每个条件,

  如果范围内的西瓜>=最小西瓜数,则跳过

  否则

    在没有西瓜的地方填上缺少数量的西瓜(当然尽量往后填,这样可以减少后面的西瓜使用,很好证明的贪心策略!)

    当然还要累加使用的西瓜数

于是就这样搞定了........

我汗....不知差分约束系统该怎么写,希望大牛留言补上!先orz..... 

 如下为在下的AC代码.....

 

 1 Code
 2 var  n,m:longint;
 3     f: array [ 0 .. 6000 ] of  boolean;
 4     c,s,e: array [ 0 .. 3000 of  longint;
 5 procedure  init;
 6            var  i:longint;
 7 begin      
 8      readln(n,m);
 9       for  i: = 1   to  m  do
10           begin
11               readln(s[i],e[i],c[i]);
12           end ;     
13 end ;
14 procedure  qsort(l,r:longint);
15            var  i,j,x,t:Longint;
16 begin
17      i: = l;j: = r;
18      x: = e[(i + j) shr  1 ];
19       repeat
20             while  e[i] < do  inc(i);
21             while  e[j] > do  dec(j);
22             if  i <= then
23                begin
24                    t: = e[i];e[i]: = e[j];e[j]: = t;
25                    t: = s[i];s[i]: = s[j];s[j]: = t;
26                    t: = c[i];c[i]: = c[j];c[j]: = t;
27                    inc(i);dec(j);
28                end ;
29       until  i > j;
30       if  l < then  qsort(l,j);
31       if  i < then  qsort(i,r);
32 end ;
33 procedure  find;
34            var  i,j,sum,ans:longint;
35 begin
36      fillchar(f,sizeof(f), 0 );
37      ans: = 0 ;
38       for  i: = 1   to  m  do
39           begin
40               sum: = 0 ;
41                for  j: = s[i]  to  e[i]  do   if  f[j]  then  inc(sum);
42                if  sum >= c[i]  then  continue;
43               sum: = c[i] - sum;
44               ans: = ans + sum;
45                for  j: = e[i]  downto  s[i]  do
46                    begin
47                         if   not (f[j])  then
48                            begin
49                                dec(sum);
50                                f[j]: = true;
51                                 if  sum = 0   then  break;
52                            end ;
53                    end ;
54           end ;
55      writeln(ans);
56 end ;
57 begin
58      init;
59      qsort( 1 ,m);
60      find;
61 end .

 

转载于:https://www.cnblogs.com/waterfalleagle/archive/2009/10/24/1589258.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值