【简●解】[ZJOI2005]午餐
【关键词】#
- 排序/贪心
【分析】#
首先,一个很明显的贪心思路,就是吃的慢的人先打饭。所以把数据按吃饭时间从大到小排一遍序。
根据的尿性,比较容易想到一个方程:前个人,在一号窗口打饭总时间为,在二号窗口打饭总时间为的最早集合时间。
然后转移。。。
从方程中就可以看出,这爆空间了啊。
所以优化。
我们可以发现,前个人打饭时间总和,所以,所以维护下打饭时间的前缀和就行了,于是,我们就可以去掉一维:
f[i][j]表示前i个人,在一号窗口打饭总时间,最早集合的时间。
那么每次转移有两种决策。
- 将第个人放在一号窗口,即:
- 将第个人放在二号窗口,即:
然后取个最小值,输出,完事。
【Code】#
//#include<bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("O2")
#include<cmath>
#include<ctime>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debug() puts("FBI WARNING!")
#define R register
#define I inline
using namespace std;
const int MAX = 200 + 5;
inline int read(){
int f = 1, x = 0;char ch;
do { ch = getchar(); if (ch == '-') f = -1; } while (ch < '0'||ch>'9');
do {x = x*10+ch-'0'; ch = getchar(); } while (ch >= '0' && ch <= '9');
return f*x;
}
int n, sum[MAX], f[MAX][MAX * MAX], ans = 0x7ffffff;
struct sakura {
int eat, wait;
}sak[MAX];
inline bool cmp(const sakura &a, const sakura &b) {
return a.eat > b.eat;
}
int main(){
n = read();
for (R int i = 1;i <= n; ++i) {
sak[i].wait = read(), sak[i].eat = read();
}
memset(f, 127, sizeof (f));
f[0][0] = 0;
sort(sak + 1, sak + 1 + n, cmp);
for (int i = 1;i <= n; ++i) sum[i] = sum[i - 1] + sak[i].wait;
for (int i = 1;i <= n; ++i) {
for (int j = 0;j <= sum[i]; ++j) {
if (j >= sak[i].wait) {
f[i][j] = min(f[i][j], max(f[i-1][j-sak[i].wait], j+sak[i].eat));
}
f[i][j] = min(f[i][j], max(f[i-1][j], sum[i]-j+sak[i].eat));
}
}
for (int i = 0;i <= sum[n]; ++i) {
ans = min(ans, f[n][i]);
}
printf("%d", ans);
return 0;
}
分类:
动态规划
, 动态规划---线性DP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!