网站做视频好不好,网站虚拟主机是什么,比较有名的公司网站,优化网站怎么做题目描述 小F 的学校在城市的一个偏僻角落#xff0c;所有学生都只好在学校吃饭。学校有一个食堂#xff0c;虽然简陋#xff0c;但食堂大厨总能做出让同学们满意的菜肴。当然#xff0c;不同的人口味也不一定相同#xff0c;但每个人的口味都可以用一个非负整数表示。 由…题目描述 小F 的学校在城市的一个偏僻角落所有学生都只好在学校吃饭。学校有一个食堂虽然简陋但食堂大厨总能做出让同学们满意的菜肴。当然不同的人口味也不一定相同但每个人的口味都可以用一个非负整数表示。 由于人手不够食堂每次只能为一个人做菜。做每道菜所需的时间是和前一道菜有关的若前一道菜的对应的口味是a这一道为b则做这道菜所需的时间为a or b-a and b而做第一道菜是不需要计算时间的。其中or 和and 表示整数逐位或运算及逐位与运算C语言中对应的运算符为“|”和“”。 学生数目相对于这个学校还是比较多的吃饭做菜往往就会花去不少时间。因此学校食堂偶尔会不按照大家的排队顺序做菜以缩短总的进餐时间。 虽然同学们能够理解学校食堂的这种做法不过每个同学还是有一定容忍度的。也就是说队伍中的第i 个同学最多允许紧跟他身后的Bi 个人先拿到饭菜。一旦在此之后的任意同学比当前同学先拿到饭当前同学将会十分愤怒。因此食堂做菜还得照顾到同学们的情绪。 现在小F 想知道在满足所有人的容忍度这一前提下自己的学校食堂做完这些菜最少需要多少时间。 输入输出格式 输入格式 第一行包含一个正整数C表示测试点的数据组数。 每组数据的第一行包含一个正整数N表示同学数。 每组数据的第二行起共N行每行包含两个用空格分隔的非负整数Ti和Bi表示按队伍顺序从前往后的每个同学所需的菜的口味和这个同学的忍受度。 每组数据之间没有多余空行。 输出格式 包含C行每行一个整数表示对应数据中食堂完成所有菜所需的最少时间。 输入输出样例 输入样例#1 2
5
5 2
4 1
12 0
3 3
2 2
2
5 0
4 0 输出样例#1 16
1说明 对于第一组数据 同学1允许同学2或同学3在他之前拿到菜同学2允许同学3在他之前拿到菜同学3比较小气他必须比他后面的同学先拿菜…… 一种最优的方案是按同学3、同学2、同学1、同学4、同学5做菜每道菜所需的时间分别是0、8、1、6及1。 【数据规模和约定】 对于30%的数据满足1 ≤ N ≤ 20。 对于100%的数据满足1 ≤ N ≤ 1,0000 ≤ Ti ≤ 1,0000 ≤ Bi ≤ 71 ≤ C ≤ 5。 存在30%的数据满足0 ≤ Bi ≤ 1。 存在65%的数据满足0 ≤ Bi ≤ 5。 存在45%的数据满足0 ≤ Ti ≤ 130。 题解 首先发现能容忍的人数最多只有7个那很容易就可以记录下8个人状态可以考虑下状压dp设f[i][j][k]表示1~i-1人都打完饭后面i~i7个人的状态为j上一次打饭是第ik个人的需要的最少时间如果当前j1为真也就是说第i个是打过饭的那么可以直接转移到f[i1][j1][k−1]可以最后一个打饭的人的编号为(i1)(k-1)ik和f[i][j][k]表示的一样而第 i个人也打完了饭所以满足「第 1 个人到第 i 个人已经打完饭」这个条件而 j1 就是说 i 之后的第 1 个人就是 i1 之后的第 0 个人就是 i1 本人i 之后的第 2 个人就是 i1 之后的第 1 个人i 之后的第 3 个人就是 i1 之后的第 2 个人…。这样就可以看出意义一样了。如果当前j1为假那我们i是不能转移到i1的因为第i个人没打饭那这是如果要满足需要的最少时间那我们只能在他的忍耐限度内枚举出一个最小的并转移但是要记得我们这个方程的上一次选的人是第ik个人而不是第i个人 代码 #includecmath
#includecstdio
#includecstring
#includeiostream
#includealgorithm
using namespace std;
const int INF0x3f3f3f3f;
int n,t[1005],b[1005],f[1005][18][20];
void work()
{int r;scanf(%d,n);for (int i1;in;i) scanf(%d%d,t[i],b[i]);memset(f,INF,sizeof(f));f[1][0][7]0;for (int i1;in;i) for (int j0;j(18);j)for (int k-8;k7;k) if (f[i][j][k8]!INF) {if (j1) f[i1][j1][k7]min(f[i1][j1][k7],f[i][j][k8]);else {rINF;for (int h0;h7;h) if (!((jh)1)) {if (ihr) break;rmin(r,ihb[ih]);f[i][j|(1h)][h8]min(f[i][j|(1h)][h8],f[i][j][k8](ik?(t[ik]^t[ih]):0));}}}int ansINF;for (int k0;k8;k) ansmin(ans,f[n1][0][k]);printf(%d\n,ans);
}
int main()
{int t;scanf(%d,t);while (t--) work();return 0;
}转载于:https://www.cnblogs.com/Comfortable/p/9205408.html