【2017.8.6普及模拟】最大(max)
来源:互联网 发布:软件企业两免三减半 编辑:程序博客网 时间:2024/05/22 12:31
题目大意: BT一天晚上发现丛林的每棵树上都有些浆果,BT想把这些果子都拿回去做研究,然而BT认为一次拿太多会很不爽,所以他想知道,他从营地到准备考察的地方,一每棵树上的浆果最大值的最小值。当然,BT的早餐能量有限,而从一棵树到另一棵树所需能量是已知的,BT要保证来回所需能量小于等于早餐所提供的能量。
输入:第一行5个正整数,n(1<=n<=10000),m(1<=m<=25000),s,t,st。分别表示有n棵树,m条路径,从营地s到考察处t,早餐的能量为st。
接下来有n行,每行1个正整数,fi。表示第i棵树上的浆果重量。 再接下来有m行,每行3个正整数,x,y,d (1<=x,y<=n)。表示第x棵树和第y棵树之间可通行,且所需能量为d。
输出: 一行,路径上浆果重量最大值的最小值。若BT无法从营地和考察地间走一个来回,则输出-1.
样例输入
4 4 2 3 8856102 1 22 4 11 3 43 4 3
样例输出
10
淼淼淼淼!
一道赤裸裸 的二分外加最短路!
二分枚举答案,删掉大于答案 的点即可。
再spfa,合法r左移,不合法l右移。
于是.....
18482621672017王誉达评测通过 10065 ms7.98 MBPascal2945 bytes2017-08-06 16:02:41注意细节!细节!细节!谨慎处理!
标程(请勿抄袭):
var
i:longint;
j,k,m,n,o,p,l,s,t,r,mid,x,y,c,head,tail,q1:int64;
b,f:array[1..100000,1..3] of int64;
q,a,h,long:array[1..100000] of int64;
bz,spfa:array[1..100001] of boolean;
procedure insert(x,y,z:longint);
begin
inc(t);
f[t,1]:=y;
f[t,2]:=q[x];
f[t,3]:=z;
q[x]:=t;
end;
function pd(a:longint):longint;
begin
if a=0 then exit(maxlongint) else exit(a);
end;
begin
assign(input,'max.in');reset(input);
assign(output,'max.out');rewrite(output);
readln(n,m,x,y,c);
c:=c div 2;
for i:=1 to n do readln(a[i]);
for i:=1 to m do begin
readln(o,p,q1);
insert(o,p,q1);
insert(p,o,q1);
end;
l:=0;r:=9223372036854775806; mid:=(l+r) div 2;
while l<=r do begin
fillchar(bz,sizeof(bz),true);
for i:=1 to n do begin
if a[i]>mid then bz[i]:=false;
long[i]:=0;
end;
if (bz[x]=false) or (bz[y]=false) then begin
l:=mid+1;
mid:=(l+r) div 2;
//if mid*2<>l+r then mid:=mid+1;
continue;
end;
fillchar(spfa,sizeof(spfa),true);
head:=0;tail:=1;h[1]:=x;spfa[x]:=false;
while head<tail do begin
inc(head);
k:=q[h[head]];
while k<>0 do begin
if bz[f[k,1]]=false then begin
k:=f[k,2];
continue;
end;
if long[h[head]]+f[k,3]<pd(long[f[k,1]]) then begin
if spfa[f[k,1]] then begin
inc(tail);
h[tail]:=f[k,1];
spfa[f[k,1]]:=false;
end;
long[f[k,1]]:=long[h[head]]+f[k,3];
end;
k:=f[k,2];
end;
end;
if (long[y]<>0) and (long[y]<=c) then begin
r:=mid-1;
mid:=(l+r) div 2;
//if mid*2<>l+r then mid:=mid+1;
end else begin
l:=mid+1;
mid:=(l+r) div 2;
//if mid*2<>l+r then mid:=mid+1;
end;
end;
///writeln(long[y]);
// if (long[y]=0) or (long[y]>c) then inc(mid);
if mid*2<>l+r then inc(mid);
writeln(mid);
close(input);close(output);
end.
- 【2017.8.6普及模拟】最大(max)
- 【2017.8.6普及模拟】最大(max)
- JZOJ__Day 7:【普及模拟】max
- OIBH杯第三次模拟赛(普及组)Problem 3 : maxsum 最大约数和
- 【普及模拟】数列 (jzoj)
- [模拟](JZOJ)【普及模拟】蚂蚁
- 1162. 【普及组模拟赛】最大杂置(set)
- Max Num(最大数)
- 【2016.10.6NOIP普及模拟】Stairs
- 【2016.10.6NOIP普及模拟】Queen
- 【2016.10.6NOIP普及模拟】Pond
- 【2016.10.6NOIP普及模拟】Power
- 【2016.10.6NOIP普及模拟】Pond
- JZOJ__Day 6:【普及模拟】团队背包(team)
- 【普及模拟】单元格(jzoj)(恶心)
- noip1996 乘法运算 - 普及组 (模拟)
- noip1996 格子位置 - 普及组 (模拟)
- [数学](JZOJ)【普及模拟】数列
- DB2移动数据实用工具的使用
- 第十二届北京师范大学程序设计竞赛决赛训练总结【7/10】
- Activiti之命令拦截器
- linux用户和组相关文件
- Day43-Struts01
- 【2017.8.6普及模拟】最大(max)
- POJ 3260 The Fewest Coins(动态规划+多重背包+完全背包)
- Java类的定义与实例化
- idea环境基于maven整合ssm
- 帅帅哥曾经遇到面试相关
- mongoDB 详解 三、mongoDB 的增删改
- 苹果开发者账号申请(公司账号)
- 英语单词辨异 —— 容易理解错的单词
- 2017 Multi-University Training Contest