码迷,mamicode.com
首页 > 其他好文 > 详细

P2157

时间:2019-12-18 17:36:03      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:span   open   ide   break   view   mes   sizeof   f11   else   

P2157

这道题确实不是那么好做的emmmm

大概Dp[i][S][K]表示的是1~i - 1已经吃完了, S为i及其后面的7个人的吃饭状态, K表示S状态下或后一个吃完的人为i + K

∴当S&1时, i这个人已经吃了, 于是有

Dp[i + 1][j >> 1][k - 1] = min(Dp[i + 1][j >> 1][k - 1], Dp[i][j][k]);

如果i没有吃, 那就随便找几个没吃的去插个队

int Lim = INF;
for (int h = 0; h < 8; ++h)
{
    if ((j >> h) & 1)continue;
    if (i + h > Lim)break;
    Lim = min(Lim,  i + h + B[i + h]);
    Dp[i][j | (1 << h)][h + 8] = min(Dp[i][j | (1 << h)][h + 8], Dp[i][j][k + 8] + (i + k ? T[i + k] ^ T[i + h] : 0));
}

  

Lim是这几个人的最大忍耐度,超过Lim的人就不能插队了

i + K == 0的话呢, 等待的时间为零, 特判一下

 

技术图片
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 const int Maxn = 1005, INF = 1e9 + 7;
 8 int N, M, T[Maxn], B[Maxn], Dp[Maxn][1 << 8][20];
 9 
10 int main()
11 {
12     scanf("%d", &M);
13     while (M--)
14     {
15         scanf("%d", &N);
16         memset(Dp, 0x7f, sizeof Dp);
17         Dp[1][0][7] = 0;
18         for (int i = 1; i <= N; ++i) scanf("%d %d", T + i, B + i);
19         for (int i = 1; i <= N; ++i)
20             for (int j = 0; j < (1 << 8); ++j)
21                 for (int k = -8; k < 8; ++k)
22                 {
23                     if (Dp[i][j][k + 8] >= INF)continue;
24                     if (j & 1) Dp[i + 1][j >> 1][k + 7] = min(Dp[i + 1][j >> 1][k + 7], Dp[i][j][k + 8]);
25                     else 
26                     {
27                         int Lim = INF;
28                         for (int h = 0; h < 8; ++h)
29                         {
30                             if ((j >> h) & 1)continue;
31                             if (i + h > Lim)break;
32                             Lim = min(Lim,  i + h + B[i + h]);
33                             Dp[i][j | (1 << h)][h + 8] = min(Dp[i][j | (1 << h)][h + 8], Dp[i][j][k + 8] + (i + k ? T[i + k] ^ T[i + h] : 0));
34                         }
35                     }
36                 }
37         int Ans(INF);
38         for (int k = 0; k < 9; ++k) Ans = min(Ans, Dp[N + 1][0][k]);
39         printf("%d\n", Ans);
40     }
41 }
View Code

 

 

 

P2157

标签:span   open   ide   break   view   mes   sizeof   f11   else   

原文地址:https://www.cnblogs.com/BlogOfASBOIER/p/12061039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!