首页 > 其他分享 >二分法

二分法

时间:2024-02-17 18:12:17浏览次数:26  
标签:dist int ll mid 二分法 vis include

通往奥格瑞玛的道路(洛谷P1462)


题目大意

无向图中每走一条路会遭受攻击损失一定血量,当血量为负时则无法到达,每到一个城市都会收取一定费用包括起点和终点。现求在能到达终点的所有方案中找出城市缴费最多的一次中的最小值。

解题思路

二分法+dijkstra,二分城市缴纳费用查找节点。

未知的代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
const int N=1e4+5,inf=0x3f3f3f3f;
ll f[N];
ll n,m,b;
ll dist[N];
bool vis[N];
vector<PII>e[N];
void dijkstra(ll x){
	fill(dist+1,dist+n+1,inf);
	fill(vis+1,vis+n+1,false);
	priority_queue<PII,vector<PII>,greater<PII>>q;
	dist[1]=0;
	q.push({dist[1],1});
	while(!q.empty()){
		ll u=q.top().second;
		q.pop();
		if(vis[u])continue;
		vis[u]=true;
		for(auto&it:e[u]){
			ll v=it.first,w=it.second;
			if(f[v]>x)continue;
			if(!vis[v]&&dist[u]+w<dist[v]){
				dist[v]=dist[u]+w;
				q.push({dist[v],v});
			}
		}
	}
}
int main(){
	cin>>n>>m>>b;
	ll l=inf,r=0; 
	for(int i=1;i<=n;i++){
		cin>>f[i];
		r=max(r,f[i]);
	}
	l=max(f[1],f[n]);
	for(int i=1;i<=m;i++){
		ll u,v,w;
		cin>>u>>v>>w;
		e[u].push_back({v,w});
		e[v].push_back({u,w});
	}
	while(l<r){
		ll mid=(l+r)>>1;
	    dijkstra(mid);a
		if(dist[n]>b)l=mid+1;
		else r=mid;
	}
	dijkstra(l);
	if(dist[n]>b)cout<<"AFK"<<endl;
	else cout<<l<<endl;
	return 0;
}

进击的奶牛(洛谷 P1824)


题目大意

略,寻找一个最大最近距离。

解题思路

二分寻找目标距离。

未知的代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,c,d[N];
int main(){
	cin>>n>>c;
	for(int i=1;i<=n;i++)cin>>d[i];
	sort(d+1,d+n+1);
	int l=d[1],r=d[n]-d[1];
	auto check=[](int x){
		int cnt=1,p=1;
		for(int i=2;i<=n;i++){
			if(d[i]-d[p]>=x){
				cnt++;
				p=i;
			}
		}
		return cnt>=c;	
	};
	int ans;
	while(l<r){
		int mid=(l+r)>>1;
		if(check(mid)){
			ans=mid;
			l=mid+1;
		}else r=mid;
	}
	cout<<ans<<endl;
	return 0;
}

Pie(poj 3122)


题目大意

分派,每个人分的派不能由不同派的小块组成,求每人最少能分多大体积。

解题思路

二分派的底面积,求最大体积。

未知的代码
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
#define PI acos(-1)
const int N=1e4+5;
const double eps=1e-8;
double a[N];
int t,n,f;
bool check(double x){
	int cnt=0;
	for(int i=1;i<=n;i++){
		cnt+=(int)(a[i]/x);
	}
	return cnt>=f;
}
int main(){
	cin>>t;
	while(t--){
		double sum=0;
		cin>>n>>f;
		f++;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			a[i]*=a[i];
			sum+=a[i];
		}
		double l=0,r=sum/f,mid;
		while(r-l>eps){
			mid=(l+r)/2;
			if(check(mid))l=mid;
			else r=mid;
		}
		cout<<fixed<<setprecision(4)<<PI*l<<endl;
	}
	return 0;
}

标签:dist,int,ll,mid,二分法,vis,include
From: https://www.cnblogs.com/eternal-world/p/17935557.html

相关文章

  • C语言实现二分法
    现在有一个任务:从一堆有序数字中找出其中一个数字有两种方法1)从头到尾依次寻找2)从该些数字中中间部位比较若小于要找数字则在后半部分否则在前半部分再进行这样的方式进行循环,直至找到或找不到此数字现介绍这样的方法——二分法在计算机科学中,二分搜索(英语:binarysearch),也称折半搜......
  • Leetcode刷题第五天-二分法-回溯
    215:第k个最大元素链接:215.数组中的第K个最大元素-力扣(LeetCode)em~~怎么说呢,快速选择,随机定一个目标值,开始找,左边比目标小,右边比目标大,左右同时不满足时,交换左右位置,直到左指针比右指针大,交换目标和右指针位置的值,此时右指针位置即时目标值的在排序好数组中的位置,如果k在右......
  • Leetcode刷题第四天-双指针-二分法
    15:三个数之和链接:15.三数之和-力扣(LeetCode)em...双冲for循环,从头去遍历,0-(a+b)是否在列表中,最终timeout数组从小到大排序,设置三个指针,i从头遍历到lens-1,j从i+1开始,k从lens-1开始,sums==0,放入结果,大于0,k-1,小于0,j+1如果i和i+1比较,相同跳过的话,会丢结果,i和i-1相等跳过,因为i-1已......
  • C# 二分法查询代码
    二分法查找,也称为折半法,是一种在有序数组中查找特定元素的搜索算法。使用二分法的前提条件是:在有序数组中查找特定元素publicstaticintSearchInsert(int[]nums,inttarget){intstart=0;//开始索引intend=nums.Length-1;//结束索引i......
  • python二分法查找
    比如要在列表arr中查找xdeff(arr,x):left=0right=len(arr)whileleft<right:mid=(left+right)//2ifmid<x:left=midelifmid>x:right=midelse:returnmid......
  • 代码随想录day 01 二分法与快慢指针
    二分法题目:实现代码如下:值得注意的是实现的方法是利用左闭右开区间还是左闭右闭区间根据选择的不同,判断条件不同将迭代的值带入到条件看符不符合区间要求就不会混淆二者快慢指针题目:本题实际上可以通过二重for循环暴力求解,复杂度是O(n^2)但是测试过程中发现超时遂放弃......
  • C练习——二分法查找有序数组
    //使用二分法折半查找,每次查找少一半数据,效率高#include<stdio.h>intsubscript(chararr[],intx,inty){intleft=0;intright=x-1;while(left<=right){intmid=left+(right-left)/2;if(arr[mid]<y)......
  • 第八届蓝桥杯赛题 分巧克力(用二分法实现)
    今日一道编程题  第八届蓝桥杯赛题中的分巧克力问题(用二分法实现)问题描述如下:儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。小明一共有N块巧克力,其中第i块是HixWi的方格组成的长方形。为了公平起见,小明需要从这N块巧克力中切出K块巧克力分给......
  • 牛顿法、割线法、二分法
    1clear;clc;2%%牛顿法3f=@(x)x^4-4*x^2+4;%函数4df=@(x)4*x^3-8*x;%一阶导数5ddf=@(x)12*x^2-8;%二阶导数6N=1000;%最大迭代次数7x=zeros(N,1);%储存迭代点8x(1)=log(8);%初始点9eps=0.00001;%容许误差1011%迭代过程12fork=2:1:N13x(k)......
  • 《力扣面试150题》题单拓展——二分法
    《力扣面试150题》题单拓展——二分法困难题:找第K大/小1.基础知识首先可以确定答案的上下界单调性分析:如果当前答案为m时,可以满足,一定有一侧是一定满足的,另一侧不一定,需要去探索boolis_ok(){}intl,r;intans;while(l<=r){intm=l+((r-l)>>1);......