题解 P6005 【[USACO20JAN]Time is Mooney G】
抢第一篇题解
这题的思路其实就是一个非常简单的dijkstra,如果跑到第一个点的数据不能更新的时候就输出
很多人不知道要跑多少次才停.其实这题因为答案要减去 T*c^2,而每条边的值 <= 1000,稍微推一下就可以发现这个程序最多跑1000次.
所以,简单暴力的做法就是暴力写1000次dijkstra (01dij或者二维1000*1000都可以).这个方法当然可以优化,但是没有超时谁理他呢
现在剩下一个小问题(如果没有经过的点,我们不能更新连同他的路).那么怎么办呢?
摆在眼前的路有两条.第一:到所有点的初始值设成-1跑.如果目前的点的值为-1就证明他没有被经过,所以需要跳过
第二:做一个vis,记录每次经过并且以前没有经过过的点.这里我用的是queue,记录所有这一次被拿到的点.
注意不要马上更新,因为如果你马上更新就会出现没有经过的点被更新了
01的意义就是保证所有点更新的都是之前更新过但这一次没有更新的,保证不会出现一条边被更新很多次的情况
话不多说,上代码
#include <iostream>
#include <algorithm>
#include <math.h>
#include <queue>
using namespace std;
int dp[1005][2],head[100005],tot = 0,n,m,c, cost[1005],ans=0,vis[1005];
struct Edge{
int from, to,next;
}edge[100005];
void add(int f,int t){
edge[++tot].from = f;
edge[tot].to = t;
edge[tot].next = head[f];
head[f] = tot;
}
void setIO(string name) {
freopen((name+".in").c_str(),"r",stdin);
freopen((name+".out").c_str(),"w",stdout);
ios_base::sync_with_stdio(0);
}
//以上不解释
void dij(int curr){
queue<int> q;//记经过的边
for (int i=1;i<=n;i++){
if (!vis[i]) continue;//如果没有经过就不跑
for (int j=head[i];j;j=edge[j].next){
if (!vis[edge[j].to]) q.push(edge[j].to);//没经过就加进queue待会更新
dp[edge[j].to][curr%2] = max(dp[edge[j].from][(curr+1)%2]+cost[edge[j].to],dp[edge[j].to][curr%2]);
//要去的点的值现在的点的值+那个点的权值.
}
}
while(!q.empty()){vis[q.front()] = true;q.pop();}
//将所有经过的点的vis设成true
ans = max(ans,(int)(dp[1][curr%2]-c*pow(curr,2)));
//更新答案
}
int main(){
// setIO("time");
cin >> n >> m >> c;
for (int i=1;i<=n;i++) cin >> cost[i];
for (int i=0;i<m;i++){
int a,b; cin >> a >> b;
add(a,b);//连边,如果要转化为权值问题只需将权值设为cost[b]就行
}
vis[1] = true;//将初始点设为已经过
for (int i=1;i<1000;i++){
dij(i);//跑1000次
}
cout << ans;//输出
}
题解 P6005 【[USACO20JAN]Time is Mooney G】的更多相关文章
- [题解] Atcoder Beginner Contest ABC 270 G Ex 题解
点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...
- 题解 P6098 【[USACO19FEB]Cow Land G】
震惊,蒟蒻学树剖第二天就打题解 所以说,理解之后树剖这种东西其实难度真心不大.至少这种模板题都可以秒切的 这里推荐一个博客: 树剖详解 蒟蒻就是在这个博客上学到的 如果想看我自己写的总结,请点 我的博 ...
- 树链剖分详解&题解 P6098 【[USACO19FEB]Cow Land G】
看到各位大佬们已经把其他的东西讲的很明白了,我这个 juruo 就讲一讲最基本的树链剖分吧. 0.树剖是什么?能吃吗? 不能吃 树剖是树链剖分的简称,我们一般说的树剖其实指重链剖分.当然,还有一种长链 ...
- 「题解」USACO15FEB Fencing the Herd G
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书: 题目 题目链接:洛谷 P3122.USACO 官网. 题意概述 给你平面上的一些点和直线,有两种操作: 新加入一个点 \((x,y)\): ...
- 题解 洛谷 P2287 [USACO07NOV]Sunscreen G
原题 传送门 有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值(minSPFi and maxSPFi),太大就晒伤了,太小奶牛没 ...
- The 2013 South America/Brazil Regional Contest 题解
A: UVALive 6525 cid=61196#problem/A" style="color:blue; text-decoration:none">Atta ...
- [题解] [SDOI2010] 古代猪文
题面 题解 题目所求即为 \[ G ^ {\sum_{d | n}C_{n}^{d}} \bmod {999911659} \] 考虑到有这样一个式子 \[ a ^ b \equiv a ^ {b \ ...
- 洛谷P1314 聪明的质监员 题解
题目 聪明的质监员 题解 这道题和之前Sabotage G的那道题类似,都是用二分答案求解(这道题还要简单一些,不需要用数学推导二分条件,只需简单判断一下即可). 同时为了降低复杂度,肯定不能用暴力求 ...
- DP测试总结
T1:三取方格数 题目描述 设有N*N的方格图,我们将其中的某些方格填入正整数,而其他的方格中放入0.某人从图得左上角出发,可以向下走,也可以向右走,直到到达右下角.在走过的路上,他取走了方格中的数. ...
随机推荐
- Promise 与 await 组合使用
看例子就行了,废话不多说! async function checkStatus(name){ return new Promise((resolve,reject) => { ...
- es6的...
es6的... (1):函数rest参数和扩展 sum1(...sum){//传多个参数 let total=0; for( ...
- 1 - apicloud - str 字符串拼接技术
<body> <label>Hello APP</label> <div id='sys-info'></div></body> ...
- 4 ~ express ~ 划分模块开发
一,根据功能进行模块划分 1,前台模块 2,后台管理模块 3,API模块 二,使用 app.use() 进行模块划分 1,app.use('/',require('./router/main')) 1 ...
- VUE注册全局组件和局部组件
全局组件 第一步:在components文件夹下建立一个子文件Users.vue <template> <div class="users"> {{msg} ...
- 2020PHP面试-SQL篇
一.乐观锁和悲观锁 1.悲观锁是指假设并发更新会发生冲突,不管冲突是否会发生,都会使用锁机制. 优点: 完全保证数据安全. 缺点:锁机制会有额外开销,并发度降低. 可能会产生死锁. 2. 乐观锁是指假 ...
- STL学习顺序
仅供参考,大家要学会自己制作,很有成就感的啊! 先看<c++标准程序库>这本书很厚,但是其实很简单,然后再看effective stl,注意顺序,我初学的时候stl还没了解多少就看effe ...
- 翻译——3_Gaussian Process Regression
使用不同的机器学习方法进行预测 续上篇2_Linear Regression and Support Vector Regression 高斯过程回归 %matplotlib inline impor ...
- NFS工作原理简述
1.首先用户访问网站程序,由程序在NFS客户端发出存取NFS文件的请求,NFS客户端上的RPC服务通过网络向NFS服务器的RPC服务的111端口发出NFS文件存取的询问请求. 2.NFS服务器的RPC ...
- css 设置奇数行偶数行样式
.list ul li:nth-child(even){ ...} //li的偶数行样式 .list ul li:nth-child(odd){ ...} //li的奇数行样式 .list ...