【二分】P1462 通往奥格瑞玛的道路
前置芝士:二分
[P1182]
对于给定的一个长度为N的正整数数列 A1∼NA1∼N,现要将其分成 M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小。
眼神告诉我,每段和的最大值满足:
1.有上下界。
2.有单调性。
求最值考虑二分。
每段和的最大值上界即为所有数之和,下界为数列元素的最大值。
二分到x后check(x),计算若每段之和不大于x可以分多少段,若大于等于m则向上二分,否则向下二分。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,m,a[maxn];
int l,r,tot,cnt;
bool judge(int x,int a[]){
for(int i=0;i<n;i++){
if(tot+a[i]<=x)tot+=a[i];
else tot=a[i],cnt++;
}
return cnt>=m;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
r+=a[i];
l=l>a[i]?l:a[i];
}
while(l<=r){
int mid=l+r>>1;
tot=cnt=0;
if(judge(mid,a))l=mid+1;
else r=mid-1;
}
printf("%d",l);
return 0;
}
P1462 (dij+二分)
同理,交费的最大值上界为F数组的最大值,下界不确定(没有限制,就用1吧)。
然后以二分到的x为最大值check,判断是否有一条路可以使得每条边的收费都小于等于此值并且走到终点之后血量不会被扣光。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10010;
#define ll long long
ll f[maxn],dis[maxn],b,v;
vector<pair<int,ll> >vec[maxn];
priority_queue<pair<ll,int> >q;
int vis[maxn],n,m,x,y;
int check(int x){
if(f[1]>x)return 0;
for(int i=1;i<=n;i++)dis[i]=1e18,vis[i]=0;
dis[1]=0;
q.push(make_pair(0,1));
while(!q.empty()){
int u=q.top().second;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=0;i<vec[u].size();i++){
int v=vec[u][i].first;
if(f[v]>x)continue;
ll w=vec[u][i].second;
if(dis[u]+w<dis[v]){
dis[v]=dis[u]+v;
q.push(make_pair(-dis[v],v));
if(v==n){
if(dis[n]>=b)return 0;
else return 1;
}
}
}
}
return 0;
}
int main(){
ll mxx=-1;
scanf("%d%d%lld",&n,&m,&b);
for(int i=1;i<=n;i++){
scanf("%lld",&f[i]);
mxx=max(mxx,f[i]);
}
for(int i=1;i<=m;i++){
scanf("%d%d%lld",&x,&y,&v);
vec[x].push_back(make_pair(y,v));
vec[y].push_back(make_pair(x,v));
}
ll ans=-1,l=1,r=mxx;
while(l<=r){
ll mid=l+r>>1;
if(check(mid))ans=mid,r=mid-1;
else l=mid+1;
}
if(ans==-1)puts("AFK");
else printf("%lld\n",ans);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· .NET中 泛型 + 依赖注入 的实现与应用