于我而言,今年的NOI简直杀人。即使我只考了第一天,我就崩溃了。
还是我太菜,我自己而言,我最多得五分不能再多了。后来交了代码确实只有五分。
反正大家知道我菜就对了。
题目
有 n 个点和 m 趟列车,第 i 辆列车于 pi 时刻从 xi 号点出发,于 qi 时刻到达 yi 号点。
有一只小猫要从 1 号点坐车到 n 号点,中途可能需要在某些站等待一段时间。每次 t 个时刻的等待,都会使小猫的烦躁值加 Ax2+Bx+C(A,B,C 为给定的全局常数)。假设最后它在第 z 个时刻到达终点,它的烦躁值会再加 z。
求小猫到达终点所需的最小烦躁值。
这是浓缩版,原题面看的我想砸键盘,实在特别长,对我来说简直是精神攻击,非常难受。简洁了一下大概就这意思。
(来源于大佬的博客写的很好很详细,我有一定参考)
原题目详见洛谷:传送门
题面就是要哭的节奏,虽然有大佬说是水题 ,就是裸的dp 。
写不出dp方程,做不来优化,秒秒哭。
首先正解
主要突破点在这个式子上。
我们先将问题简化,只考虑过程,不考虑位置的限制条件。
写出烦躁值dp方程(只能对应一条路径),则有:
巨佬们统一认证运用线性优化,我大概明白怎么回事。但是完全不会用怎么办!
具体思路详见洛谷题解。我没看懂。
所以正解凉掉。
水过此题
但是错误暴力的 方法可以磕到100,所以我们要坚持暴力上省队
我们先将火车按照出发时间排序。
然后就过了。noi的数据怎么这么水啊喂!
附代码:(这波暴力我给满分)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
struct node{
int x,y,p,q;
bool operator<(node a)const{
return p<a.p;
}
}a[200100];
int n,m,A,B,C,T,ans;
int f[100100][1010];
int calc(int x){
return x*x*A+x*B+C;
}
int main(){
scanf("%d%d%d%d%d",&n,&m,&A,&B,&C);
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].p,&a[i].q);
T=max(T,a[i].q);
}
memset(f,0x3f,sizeof(f));
f[1][0]=0;
sort(a+1,a+m+1);
for(int i=1;i<=m;i++)
for(int j=0;j<=a[i].p;j++){
if(f[a[i].x][j]==inf)continue;
f[a[i].y][a[i].q]=min(f[a[i].y][a[i].q],f[a[i].x][j]+calc(a[i].p-j));
}
int ans=inf;
for(int i=0;i<=T;i++)
ans=min(ans,f[n][i]+i);
printf("%d\n",ans);
}