<SDOI2009>学校食堂
2024-08-29 23:03:36
我.
调了快一天
因为一个位置错误的感叹号
:-)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
狗dp
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 99999999
using namespace std; int c,n;
int t[],b[],dp[][<<][];//dp 前i-1个人已经打完饭了,第i个人及其后面7个人的状态,上一次打饭的人与i的相对距离(向前为-向后为+) 实际运用时由于不能为负数 所以要+8 int time(int a,int b){if(a==)return ; return t[a]^t[b];}//题目要求的时间计算 int main()
{
int i,j,k;
scanf("%d",&c); for(int l=;l<=c;l++)
{
scanf("%d",&n);
for(i=;i<=n;i++) scanf("%d%d",&t[i],&b[i]); for(i=;i<=n+;i++)
for(j=;j<(<<);j++)
for(k=-;k<=;k++)
dp[i][j][k+]=inf;
dp[][][]=;// k -1+8 //初始化 for(i=;i<=n;i++)//枚举n个人
for(j=;j<(<<);j++)//枚举状态
for(k=-;k<=;k++)//枚举相对位置
if(dp[i][j][k+]<inf)//没轮到呢.怎么排他后面的...?!
{
if(j&) dp[i+][j>>][k+]=min(dp[i+][j>>][k+],dp[i][j][k+]);else//如果已经打完了 就可以 扔了emm 下一个还未打的时间与上一个打完时间相同
{
int r=inf;//忍受范围
for(int m=;m<=;m++)//枚举下一个人
{
if(!((j>>m)&))//判断后面的人是否吃完了
{
if(i+m>r)break;//超出了忍耐限度!
r=min(r,i+m+b[i+m]);//更新目前最小忍耐限度
dp[i][j+(<<m)][m+]=min(dp[i][j+(<<m)][m+],dp[i][j][k+]+time(i+k,i+m));//emm让他有饭(雾
}
}
}
}
int ans=inf;
for(i=;i<;i++)ans=min(ans,dp[n+][][i]);//全部人都有饭啦!
printf("%d\n",ans);
}
return ;
}
最新文章
- ypzl药品质量不合格数据库-excel自动排版
- AJAX练习(一):制作可以自动校验的表单(从原理上分析ajax的作用)
- Wireshark分析器分析数据流过程
- 【BZOJ】【2818】Gcd
- PHP 进行蜘蛛访问日志统计
- ajax检查用户名
- xamarin SimpleAdapter绑定出错问题
- util:properties与context:property-placeholder
- 转:Eclipse Debug 界面应用详解——Eclipse Debug不为人知的秘密
- 【可视化】div背景半透明
- .Net Core 学习之路-AutoFac的使用
- [AtCoder 2702]Fountain Walk - LIS
- Visitor 模式心得
- C# DateTimePicker控件获取他的年,月,日,时,分,秒
- 凭什么相信你,我的CNN模型
- 每天记命令:lscpu 和 cat /proc/cpuinfo
- php cli命令 自定义参数传递
- 20155323刘威良《网络对抗》Exp6 信息搜集与漏洞扫描
- DateFrame
- menu 一组 只能选择一个