首页 > 其他分享 >0|1分数规划

0|1分数规划

时间:2024-02-15 21:44:06浏览次数:21  
标签:分数 int sum db mid 规划 rep define

这种分子上一大坨求和,分母上一大坨求和,然后求最值的问题属于一类特殊的问题。被称为0|1分数规划问题。
也就是\(\frac{\sum{f_i} * w_i} {\sum{g_i} *w_i }\)
找一组\({w_i} \in \{0,1\}\)使上面的式子最小
通常的做法就是二分答案
假设我们要求的是最大值,然后二分一个答案mid,然后推式子

\[\frac{\sum{f_i} * w_i} {\sum{g_i} *w_i }>mid \]

\[{\sum{f_i} * w_i}-mid*{\sum{g_i} *w_i }>0 \]

\[w_i *({\sum{f_i}-mid*g_i})>0 \]

那么只要求出不等号左边的式子的最大值就行了。如果最大值比 0 要大,说明 mid 是可行的,否则不可行

针对于这道题目也是
这里既有边权又有点权,可以把点权下放到出边上
然后上面的式子的含义也就变为了在图上求正环。
正环也可以用spfa来求,只需要和负环对称一下,求最短路变成求最长路即可。

#include <bits/stdc++.h> 
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define inf 0x3f3f3f3f*1ll

using namespace std;

void solve()
{
	int n,m;
	cin>>n>>m;
	vector<vector<pii>>g(n+1);
	vector<int>a(n+1);
	rep(i,1,n){
		cin>>a[i];
	}
	rep(i,1,m){
		int u,v,w;
		cin>>u>>v>>w;
		g[u].pb({v,w});
	}	
	auto check=[&](db tar){
		vector<int>inq(n+1,0);
		vector<int>cnt(n+1,0);
		vector<db>d(n+1,0);
		queue<int>q;
		rep(i,1,n){
			q.push(i);
			inq[i]=1;
		}
		while(q.size()){
			auto u=q.front();
			q.pop();
			inq[u]=0;
			for(auto it:g[u]){
				int v=it.x,w=it.y;
				if(d[v]<d[u]+a[u]-w*tar){
					d[v]=d[u]+a[u]-w*tar;
					cnt[v]=cnt[u]+1;
					if(cnt[v]>=n)	return true;
					if(!inq[v]){
						inq[v]=1;
						q.push(v);
					}
				}
			}
		}
		return false;
	};
	db l=0,r=1010;
	while(r-l>1e-5){
		db mid=(l+r)/2;
		if(check(mid))	l=mid;
		else	r=mid;
	}
	//c++默认输出6位精度
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<l<<endl;
}

signed main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//   	freopen("1.in", "r", stdin);
	int _;
//	cin>>_;
//	while(_--)
	solve();
	return 0;
}

标签:分数,int,sum,db,mid,规划,rep,define
From: https://www.cnblogs.com/cxy8/p/18016648

相关文章

  • 入驻爱发电:谈谈技术规划
    许久没有写文章了。六月底毕业考试,让我不得不停下写博客的节奏,把全身心投入到总复习中。今日抽空上园子看了看,最新的博文也是一年前了,还有几篇七个月前的文章存着,闲来无事便发了一篇早在公众号发布的博客。说说规划吧。七月考完试,就打算保持每两周一更的频率,把脑子里的知识都梳......
  • 【算法】【动态规划】过桥问题
    1 题目在一个夜黑风高的晚上,有n(n<=50)个小朋友在桥的这边,现在他们需要过桥,但是由于桥很窄,每次只允许不大于两人通过,他们只有一个手电筒,所以每次过桥的两个人需要把手电筒带回来,i号小朋友过桥的时间为T[i],两个人过桥的总时间为二者中时间长者。问所有小朋友过桥的总时间最短是......
  • 动态规划基础笔记
    背包问题 01背包  一般的动态规划要先考虑好状态,这个状态是一个集合,要能分成几个子集,然后从这些子集(小问题),推到这一整个集合(大问题),且求解过程是一样的,就可以可以转换成大问题分解成小问题一个一个求解,最后合并先要知道状态表示什么再要知道dp的属性,应该跟所求有关,只会......
  • 动态规划题目合集
    3n多米诺问题\(dp[i]\)表示前\(i\)列的方案数,\(dp2[i]\)表示前\(i\)列但是最上面一行缺一个的方案数。\(dp[i],dp2[i]\)可以相互递推,而且刚好是矩阵递推。矩阵快速幂优化。Walk有向无权图。求长度\(k\)的路径条数。我们发现邻接矩阵的\(k\)次方各个元素求和就是......
  • P1068 [NOIP2009 普及组] 分数线划定
    [NOIP2009普及组]分数线划定题目描述世博会志愿者的选拔工作正在A市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的\(150\%\)划定,即如果计划录取\(m\)名志愿者,则面试分数......
  • 【算法】【动态规划】钢条切割
    1 题目来自算法导论的一道经典题目:2 解答动态规划原理虽然已经用动态规划方法解决了上面问题,但是大家可能还跟我一样并不知道什么时候要用到动态规划。总结一下上面的斐波拉契数列和钢条切割问题,发现两个问题都涉及到了重叠子问题,和最优子结构。①最优子结构用动态规......
  • 线性规划和网络流的单纯形法
    线性规划线性规划问题求\[\max\sum_{i=1}^nc_jx_j\\\text{s.t.:}\\\sum_{t=1}^na_{it}x_t\leb_i,i\in\Z\cap[1,m_1]\\\sum_{t=1}^na_{it}x_t=b_i,i\in\Z\cap(m_1,m_1+m_2]\\\sum_{t=1}^na_{it}x_t\geb_i,i\in(m_1+m_2,m_1+m_2+m_3]\\x_......
  • 野餐规划
    太难证明了,到现在都看不懂。。。这道题目好像可以用wqs二分做把这道题目,陈立杰出的tree那道题目,还有洛谷P5633都搞明白,注意wqs二分和这种做法都要懂然后蓝书好像描述不好,看这篇题解他讲的第一个证明我花了好久看懂了:\(e\)指不在\(T\)上的边,\(P\)是\(T\)上从\(u\)到\(v\)的一条......
  • [经验] 对未来的规划800字作文
    1、对未来的规划对未来的规划是每个人必须思考的问题。未来不仅仅是一段时间,更是我们努力的目标和方向。规划好未来,才能有所依照,不至于迷失自我。首先,我们应该认真思考自己的职业规划,包括职业方向、职业技能以及未来发展方向。分析自身优劣势,结合未来市场需求和潜力,选择符合自己兴......
  • 动态规划(线性)
    898.数字三角形https://www.acwing.com/problem/content/900/  #include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;constintN=510,INF=1e9;intn;inta[N][N],p[N][N];intmain(){cin>>n;for(in......