1226: [SDOI2009]学校食堂Dining - BZOJ

Description

小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭。学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴。当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数表示。由于人手不够,食堂每次只能为一个人做菜。做每道菜所需的时间是和前一道菜有关的,若前一道菜的对应的口味是a,这一道为b,则做这道菜所需的时间为(a or b)-(a and b),而做第一道菜是不需要计算时间的。其中,or 和and 表示整数逐位或运算及逐位与运算,C语言中对应的运算符为“|”和“&”。学生数目相对于这个学校还是比较多的,吃饭做菜往往就会花去不少时间。因此,学校食堂偶尔会不按照大家的排队顺序做菜,以缩短总的进餐时间。虽然同学们能够理解学校食堂的这种做法,不过每个同学还是有一定容忍度的。也就是说,队伍中的第i 个同学,最多允许紧跟他身后的Bi 个人先拿到饭菜。一旦在此之后的任意同学比当前同学先拿到饭,当前同学将会十分愤怒。因此,食堂做菜还得照顾到同学们的情绪。现在,小F 想知道在满足所有人的容忍度这一前提下,自己的学校食堂做完这些菜最少需要多少时间。

Input

第一行包含一个正整数C,表示测试点的数据组数。每组数据的第一行包含一个正整数N,表示同学数。每组数据的第二行起共N行,每行包含两个用空格分隔的非负整数Ti和Bi,表示按队伍顺序从前往后的每个同学所需的菜的口味和这个同学的忍受度。每组数据之间没有多余空行。

Output

包含C行,每行一个整数,表示对应数据中食堂完成所有菜所需的最少时间。

Sample Input

2

5

5 2

4 1

12 0

3 3

2 2

2

5 0

4 0

 

Sample Output

16

1

 

HINT

对于第一组数据:同学1允许同学2或同学3在他之前拿到菜;同学2允许同学3在他之前拿到菜;同学3比较小气,他必须比他后面的同学先拿菜…… 一种最优的方案是按同学3、同学2、同学1、同学4、同学5做菜,每道菜所需的时间分别是0、8、1、6及1。 【数据规模和约定】对于30%的数据,满足1 ≤ N ≤ 20。对于100%的数据,满足1 ≤ N ≤ 1,000,0 ≤ Ti ≤ 1,000,0 ≤ Bi ≤ 7,1 ≤ C ≤ 5。存在30%的数据,满足0 ≤ Bi ≤ 1。存在65%的数据,满足0 ≤ Bi ≤ 5。存在45%的数据,满足0 ≤ Ti ≤ 130。

 

 

状压dp

因为bi<=7,所以我们只要记录没吃饭的第一个人i和i后面7个人是否吃了饭,还有上一次吃饭的人是哪个(和i的相对位置很近,-8到7)

所以状态就是f[i,s,k]

转移很好想,随便乱yy一下

 1 const
 2     maxn=1010;
 3     inf=1684300900;
 4 var
 5     f:array[0..maxn,0..256,-10..10]of longint;
 6     a,b:array[0..maxn]of longint;
 7     n,t:longint;
 8 
 9 procedure down(var x:longint;y:longint);
10 begin
11     if x>y then x:=y;
12 end;
13 
14 function calc(x,y:longint):longint;
15 begin
16     if x=0 then exit(0);
17     exit(a[x] xor a[y]);
18 end;
19 
20 procedure main;
21 var
22     i,j,k,l,r,ans:longint;
23 begin
24     fillchar(f,sizeof(f),100);
25     read(n);
26     for i:=1 to n do
27       read(a[i],b[i]);
28     f[1,0,-1]:=0;
29     for i:=1 to n do
30       for j:=0 to 1<<8-1 do
31         for k:=-8 to 7 do
32           if f[i,j,k]<>inf then
33           if j and 1=1 then down(f[i+1,j>>1,k-1],f[i,j,k])
34           else
35             begin
36               r:=inf;
37               for l:=0 to 7 do
38                 if j and (1<<l)=0 then
39                 begin
40                   if i+l>r then break;
41                   down(r,b[i+l]+i+l);
42                   down(f[i,j+1<<l,l],f[i,j,k]+calc(i+k,i+l));
43                 end;
44             end;
45     ans:=inf;
46     for i:=-8 to -1 do
47       down(ans,f[n+1,0,i]);
48     writeln(ans);
49 end;
50 
51 begin
52     read(t);
53     while t>0 do
54       begin
55         dec(t);
56         main;
57       end;
58 end.
View Code

 

转载于:https://www.cnblogs.com/Randolph87/p/3756441.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<!DOCTYPE html> <html> <head> <title>Car Vacation - Destination</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QLeykU8jmeO+TX3qgNkP0GNIgB6Hp" crossorigin="anonymous"> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <header> <nav class="navbar navbar-expand-lg navbar-light bg-light"> <a class="navbar-brand" href="#">Car Vacation</a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item active"> <a class="nav-link" href="#">Home</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Destination</a> </li> <li class="nav-item"> <a class="nav-link" href="#">About Us</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Contact</a> </li> </ul> </div> </nav> </header> <main> <section class="banner"> <h1>Destination</h1> </section> <section class="cards"> <div class="container"> <div class="row"> <div class="col-md-4"> <div class="card"> <img class="card-img-top" src="https://picsum.photos/seed/picsum/300/200" alt="Card image cap"> <div class="card-body"> <h5 class="card-title">New York</h5> <p class="card-text">New York City is the most populous city in the United States. It is known for its famous landmarks such as the Statue of Liberty, Empire State Building and Central Park.</p> <a href="#" class="btn btn-primary">Learn More</a> </div> </div> </div> <div class="col-md-4"> <div class="card"> <img class="card-img-top" src="https://picsum.photos/seed/picsum/300/200" alt="Card image cap"> <div class="card-body"> <h5 class="card-title">Paris</h5> <p class="card-text">Paris, the capital of France, is known for its artistic heritage, fashion, fine dining and iconic landmarks such as the Eiffel Tower, Notre-Dame Cathedral and the Louvre Museum.</p> <a href="#" class="btn btn-primary">Learn More</a> </div> </div> </div> <div class="col-md-4"> <div class="card"> <img class="card-img-top" src="https://picsum.photos/seed/picsum/300/200" alt="Card image cap"> <div class="card-body"> <h5 class="card-title">Tokyo</h5> <p class="card-text">Tokyo, the capital of Japan, is known for its modern skyscrapers, historic temples, shopping and entertainment districts, and unique blend of traditional and contemporary culture.</p> <a href="#" class="btn btn-primary">Learn More</a> </div> </div> </div> </div> </div> </section> </main> <footer> <div class="container"> <div class="row"> <div class="col-md-12"> <p>© 2020 Car Vacation. All rights reserved.</p> </div> </div> </div> </footer> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QLeykU8jmeO+TX3qgNkP0GNIgB6Hp" crossorigin="anonymous"></script> </body> </html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值