ACM-ICPC (10/12)
01分数规划
背景:根据楼教主回忆,曾经在一场比赛中秒掉了一道最优比例生成树问题,导致很多人跟风失败,最终悲剧。
什么是01分数规划呢?
这样的等式求最大,最小即为01分数规划。
如果你不知道该如何去解,你可能会去贪心,DP去做,但是这样是很复杂的。
解法:二分,迭代(计算几何大佬都知道这种方案,但是我不是)
直接二分ans, 根据符号二分转移。
例题一:pku 2796


题意:
最大。
#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn = ;
int n,k;
double a[maxn],b[maxn];
double c[maxn];
bool cmp(double a,double b) {
return a > b;
}
bool calc(double x) {
for(int i = ; i < n; i++)
c[i] = a[i] - x*b[i];
sort(c,c+n,cmp);
double sum = ;
for(int i = ; i < n-k; i++)
sum +=c[i];
if(sum>=) return true;
return false;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&n,&k),n) {
for(int i = ; i < n; i++) scanf("%lf",&a[i]);
for(int i = ; i < n; i++) scanf("%lf",&b[i]);
double l = ,r = ;
while(r-l>1e-) {
double mid = (l + r)/;
if(calc(mid))
l = mid;
else r = mid;
}
printf("%.0lf\n",l*);
}
return ;
}
例题二:pku 2728 最优比例生成树


题意:给定n 个点,坐标(x,y,z),n条无向边的图,国王将这n个点连起来(生成树),建一条边有花费, 求单位最小花费最小比例。
同理:二分这个比例,边权为 ,最小生成树 ans >= 0,说明 x过小,二分转移 l = mid;
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = ;
double maps[maxn][maxn];
bool vis[maxn];
double dis[maxn];
int n;
double Prim() {
memset(vis,false,sizeof(vis));
for(int i = ; i<= n; i++)
dis[i] = ;
double ans = ;
dis[] = ;
for(int i = ; i <= n; i++) {
double tmp = ;
int k = ;
for(int j = ; j <= n; j++) {
if(!vis[j]&&dis[j]<tmp) {
tmp = dis[j];
k = j;
}
}
vis[k] = true;
ans += tmp;
for(int j = ; j<= n; j++) {
if(!vis[j]&&dis[j]>maps[k][j])
dis[j] = maps[k][j];
}
}
return ans;
}
struct Node {
double x,y,z;
}nodes[maxn];
double dist(int i,int j,double x) {
double fx = fabs(nodes[i].x-nodes[j].x);
double fy = fabs(nodes[i].y-nodes[j].y);
double fz = fabs(nodes[i].z-nodes[j].z);
return fz - x*sqrt(fx*fx+fy*fy);
}
double eps = 1e-;
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n),n) {
for(int i = ; i <= n; i++) scanf("%lf%lf%lf",&nodes[i].x,&nodes[i].y,&nodes[i].z);
double l = ,r = ;
while(r-l>1e-) {
double mid = (r+l)/;
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
maps[i][j] = dist(i,j,mid);
double ans = Prim();
if(ans<=)
r = mid;
else l = mid;
}
printf("%.3f\n",l);
}
return ;
}
例题三:pku 3621 最优比例环。(双倍经验题Uva 11090,题意相反)


题意:给定一个L个节点,P条有向边的图,奶牛从一个城市出发,走一个环回到起点,点上有权值,边上也有长度,求单位长度的点权最大。
分析:还是二分 ans,由于是一个环,一条边上,算起点权值就好了。改边权, ,
由于求的是比例最大,这时SPFA,应反向松弛,才能得到最大的比例。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <string.h>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = ;
struct Edge {
int from,to;
double dist;
};
struct BellmanFord
{
int n, m;
vector<Edge> edges;
vector<int> G[maxn];
bool inq[maxn];
double d[maxn];
int p[maxn];
int cnt[maxn];
void init(int n)
{
this->n = n;
for(int i = ; i < n; i++) G[i].clear();
edges.clear();
}
void AddEdge(int from, int to, double dist)
{
edges.push_back((Edge)
{
from, to, dist
});
m = edges.size();
G[from].push_back(m-);
}
bool negativeCycle()
{
queue<int> Q;
memset(inq, , sizeof(inq));
memset(cnt, , sizeof(cnt));
for(int i = ; i < n; i++)
{
d[i] = ;
inq[] = true;
Q.push(i);
}
while(!Q.empty())
{
int u = Q.front();
Q.pop();
inq[u] = false;
for(int i = ; i < (int)G[u].size(); i++)
{
Edge& e = edges[G[u][i]];
if(d[e.to] < d[u] + e.dist) //反向松弛
{
d[e.to] = d[u] + e.dist;
p[e.to] = G[u][i];
if(!inq[e.to])
{
Q.push(e.to);
inq[e.to] = true;
if(++cnt[e.to] > n) return true;
}
}
}
}
return false;
}
}sol;
int L,P;
double f[maxn];
double t[maxn];
vector<Edge> edgestmp;
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&L,&P);
sol.init(L);
for(int i = ; i < L; i++) scanf("%lf",&f[i]);
for(int i = ; i < P; i++) {
int u,v;
double dist;
scanf("%d%d%lf",&u,&v,&dist);
u--;v--;
edgestmp.push_back((Edge){u,v,dist});
sol.AddEdge(u,v,dist);
}
double l = ,r = ;
while(r-l>1e-) {
double mid = (r+l)/;
sol.init(L);
for(int i = ; i < P; i++) {
int u = edgestmp[i].from;
int v = edgestmp[i].to;
double dist = edgestmp[i].dist;
sol.AddEdge(u,v,f[u]-mid*dist);
}
if(sol.negativeCycle())
l = mid;
else r = mid;
}
printf("%.2f\n",l);
return ;
}
ACM-ICPC (10/12)的更多相关文章
- 2016 ACM/ICPC Asia Regional Qingdao Online 1001/HDU5878 打表二分
I Count Two Three Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Java in ACM/ICPC
目录 Java在ACM/ICPC中的特点 在ACM/ICPC中使用Java需要注意的问题 Java与高精度计算 1.Java在ACM/ICPC中的特点 Java的语法和C++几乎相同 Java在执行计 ...
- 2016 ACM/ICPC Asia Regional Qingdao Online(2016ACM青岛网络赛部分题解)
2016 ACM/ICPC Asia Regional Qingdao Online(部分题解) 5878---I Count Two Three http://acm.hdu.edu.cn/show ...
- 2017 ACM/ICPC Asia Regional Qingdao Online
Apple Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submi ...
- ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))
祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...
- ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 D. Delay Time
Problem D. Delay Time Input file: standard input Output file: standard output Time limit: 1 second M ...
- 【转】ACM/ICPC生涯总结暨退役宣言—alpc55
转自:http://hi.baidu.com/accplaystation/item/ca4c2ec565fa0b7fced4f811 ACM/ICPC生涯总结暨退役宣言—alpc55 前言 早就该写 ...
- hduoj 4715 Difference Between Primes 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4715 Difference Between Primes Time Limit: 2000/1000 MS (J ...
- hduoj 4712 Hamming Distance 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4712 Hamming Distance Time Limit: 6000/3000 MS (Java/Other ...
- hduoj 4707 Pet 2013 ACM/ICPC Asia Regional Online —— Warmup
http://acm.hdu.edu.cn/showproblem.php?pid=4707 Pet Time Limit: 4000/2000 MS (Java/Others) Memory ...
随机推荐
- CAPL编程实现诊断刷写,车联网FOTA流程自动化测试(代码篇)
原创内容,转载请注明出处 接上篇,本文主要讲CAPL编程详细实现,软件环境CANoe 11.0 一.Simulation Setup 1.建模之前,首先创建一个.DBC文件.如果不会,可以用一个 ...
- Linux——文件和文件夹的操作
Linux有三种文件: 普通文件(包括文本文件.源码文件.可执行文件等等) 设备文件(或者成为特殊文件,linux通过设备文件与外部设备进行通讯,例如:光驱.打印机.终端.modern) 设备文件有两 ...
- django学习笔记——搭建博客网站
1. 配置环境,创建django工程 虚拟环境下建立Django工程,即创建一个包含python脚本文件和django配置文件的目录或者文件夹,其中manage.py是django的工程管理助手.(可 ...
- python - 约瑟夫问题
在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中.39个犹太人决定宁愿死也不要被敌人俘虏,商定一种特殊的方式自杀,41个人排成一个圆圈,由第1个人开始报数,每报到第3人该人就必须自 ...
- 进入保护模式(一)——《x86汇编语言:从实模式到保护模式》读书笔记12
之前已经做了一些理论上的铺垫,这次我们就可以看代码了. 一.代码清单 ;代码清单11-1 ;文件名:c11_mbr.asm ;文件说明:硬盘主引导扇区代码 ;创建日期:2011-5-16 19:54 ...
- 数据段描述符和代码段描述符(一)——《x86汇编语言:从实模式到保护模式》读书笔记10
一.段描述符的分类 在上一篇博文中已经说过,为了使用段,我们必须要创建段描述符.80X86中有各种各样的段描述符,下图展示了它们的分类. 看了上图,你也许会说:天啊,怎么这么多段描述符啊!我可怎么记住 ...
- jquery返回顶部和底部插件和解决ie6下fixed插件
(function($){ //返回顶部和底部插件 $.fn.extend({ goTopBootom:function (options){ //默认参数 var defaults = { &quo ...
- xss攻击汇总--转
(1)普通的XSS JavaScript注入<SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>(2)IMG标签XSS使用JavaScr ...
- 【SoapUI】http接口测试
一.接口介绍 API(Application Programming Interface,应用程序编程接口) 1.硬件接口 USB接口 硬盘接口 SD卡接口 LAN口和WAN口 CONSOLE口 .. ...
- [转]使用 Razor 进行递归操作
本文转自:http://www.cnblogs.com/zbw911/archive/2013/01/10/2855025.html 做一个菜单,多级的会遇到递归的问题,打算在code中做一个递归方法 ...