2014在百度之星资格赛的第二个问题Disk Schedule
事实上,我认为它可以用来费用流问题。但光建地图上加班。
。。不科学啊。。
。
因副作用太大,否则,必然在。最后,想啊想,或者使用dp对。。。。
别想了一维dp。。。
。我不知道我是怎么想。无论如何,这是ac该
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<cmath>
#include<cassert>
#include<cstring>
#include<iomanip>
using namespace std;
#ifdef _WIN32
#define i64 __int64
#define out64 "%I64d\n"
#define in64 "%I64d"
#else
#define i64 long long
#define out64 "%lld\n"
#define in64 "%lld"
#endif
/************ for topcoder by zz1215 *******************/
#define foreach(c,itr) for(__typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)
#define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++)
#define FF(i,a) for( int i = 0 ; i < (a) ; i ++)
#define FFD(i,a,b) for( int i = (a) ; i >= (b) ; i --)
#define S64(a) scanf(in64,&a)
#define SS(a) scanf("%d",&a)
#define LL(a) ((a)<<1)
#define RR(a) (((a)<<1)+1)
#define pb push_back
#define pf push_front
#define X first
#define Y second
#define CL(Q) while(!Q.empty())Q.pop()
#define MM(name,what) memset(name,what,sizeof(name))
#define MC(a,b) memcpy(a,b,sizeof(b))
#define MAX(a,b) ((a)>(b)? (a):(b))
#define MIN(a,b) ((a)<(b)? (a):(b))
#define read freopen("in.txt","r",stdin)
#define write freope("out.txt","w",stdout) const int inf = 0x3f3f3f3f;
const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL;
const double oo = 10e9;
const double eps = 10e-9;
const double pi = acos(-1.0);
const int maxn = 1111; int dp[maxn];
int t[maxn];
int s[maxn];
int m,n; int pas[maxn]; int pass(int a,int b)
{
if(a>=b) return 0;
return pas[b]-pas[a];
} int find(int x,int y)
{
return min(abs(x-y),360-abs(x-y));
} int dis(int a,int b)
{
return abs(t[b]-t[a])*400 + find(s[b],s[a]);
} int main()
{
cin>>m;
for(int tt=1;tt<=m;tt++)
{
cin>>n;
t[0] = 0;
s[0] = 0;
for(int i=1;i<=n;i++)
{
SS(t[i]);
SS(s[i]);
} pas[0] = 0;
for(int i=1;i<=n;i++)
{
pas[i] = pas[i-1]+dis(i-1,i);
} dp[0] = 0; for(int i=1;i<=n;i++)
{
dp[i] = dis(0,i) + pass(0,i-1);
for(int j=1;j<i;j++)
{
dp[i] = min(dp[i], dp[j] + dis(j,i) + dis(j-1,j+1)+pass(j+1,i-1) );
dp[i] = min(dp[i], dp[j] + dis(j,i)+ pass(j-1,i-1));
dp[i] = min(dp[i], dp[j] + dis(j-1,i) + pass(j,i-1));
}
}
dp[n]+=dis(n-1,n)+n*10;
cout<<dp[n]<<endl;
}
return 0;
}
接下来是费用流tle代码。大概意思就是把数据点的那条边的费用变成一个非常小的负数。那么,一定要会选择那条边,不然得到的一定不是最小费用流,这样就起了限制作用
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#include<cmath>
#include<cassert>
#include<cstring>
#include<iomanip>
using namespace std;
#ifdef _WIN32
#define i64 __int64
#define out64 "%I64d\n"
#define in64 "%I64d"
#else
#define i64 long long
#define out64 "%lld\n"
#define in64 "%lld"
#endif
/************ for topcoder by zz1215 *******************/
#define foreach(c,itr) for(__typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)
#define FOR(i,a,b) for( int i = (a) ; i <= (b) ; i ++)
#define FF(i,a) for( int i = 0 ; i < (a) ; i ++)
#define FFD(i,a,b) for( int i = (a) ; i >= (b) ; i --)
#define S64(a) scanf(in64,&a)
#define SS(a) scanf("%d",&a)
#define LL(a) ((a)<<1)
#define RR(a) (((a)<<1)+1)
#define pb push_back
#define pf push_front
#define X first
#define Y second
#define CL(Q) while(!Q.empty())Q.pop()
#define MM(name,what) memset(name,what,sizeof(name))
#define MC(a,b) memcpy(a,b,sizeof(b))
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))
#define read freopen("in.txt","r",stdin)
#define write freope("out.txt","w",stdout) const i64 inf64 = 0x3f3f3f3f3f3f3f3fLL;
const double oo = 10e9;
const double eps = 10e-9;
const double pi = acos(-1.0);
const int maxn = 2222;
const int add = 1111; int m,n;
int t[add];
int s[add]; struct zz
{
int from;
int to;
i64 c;
i64 cost;
int id;
}zx; int start = 0;
int end = 2221;
i64 cc = 100000000; vector<zz>g[maxn];
i64 way[maxn];
int bid[maxn];
bool inq[maxn]; void link(int now,int to,int c,i64 cost,int bc=0)
{
zx.from = now;zx.to=to;zx.c=c;zx.cost=cost;
zx.id = g[zx.to].size();
g[zx.from].pb(zx);
swap(zx.from,zx.to);
zx.c=bc;zx.cost=-cost;
zx.id = g[zx.to].size()-1;
g[zx.from].pb(zx);
return ;
} bool spfa()
{
for(int i=0;i<maxn;i++)
{
way[i]=inf64; // 最小费用流
}
way[start]=0;
deque<int>q;
MM(inq,false);
inq[start]=true;
q.pb(start);
i64 now,to,temp;
while(!q.empty())
{
now = q.front();
q.pop_front();
for(int i=0;i<g[now].size();i++)
{
to = g[now][i].to;
if(g[now][i].c>0)
{
temp = g[now][i].cost+way[now];
if(temp<way[to])
{
bid[to] = g[now][i].id;
way[to] = temp;
if(!inq[to])
{
inq[to]=true;
if(q.empty() || way[to]<way[q.front()]) q.pf(to); // 最小费用流
else
q.pb(to);
}
}
}
}
inq[now]=false;
}
return way[end]!=inf64;
}
pair<i64,i64> dfs(i64 flow = inf64,i64 to = end)
{
if(to == start) return make_pair(flow,0);
i64 now=g[to][bid[to]].to;
int id = g[to][bid[to]].id;
pair<i64,i64>temp=dfs(min(flow,g[now][id].c),now);
g[now][id].c-=temp.X;
g[to][bid[to]].c+=temp.X;
temp.Y+=temp.X*g[now][id].cost;
return temp;
} i64 gao()
{
i64 ans=0;
spfa();
ans+=dfs().Y;
spfa();
ans+=dfs().Y;
return ans;
} int find(int x,int y)
{
return min( abs(x-y), 360 - abs(x-y));
} int dis(int at,int as,int bt,int bs)
{
return (abs(bt-at))*400 + find(as,bs);
} void build()
{
for(int i=0;i<maxn;i++)
{
g[i].clear();
}
for(int i=1;i<=n;i++)
{
link(start,i,1,dis(0,0,t[i],s[i]));
}
link(start,end,1,dis(0,0,t[n],s[n]));
for(int i=1;i<=n;i++)
{
link(i,i+add,1,-cc);
for(int j=i+1;j<=n;j++)
{
link(i+add,j,1,dis(t[i],s[i],t[j],s[j]));
}
}
for(int i=1;i<=n;i++)
{
link(i+add,end,1,dis(t[i],s[i],t[n],s[n]));
}
return ;
} int main()
{
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t[i]>>s[i];
}
build();
i64 ans = gao();
ans += cc*n;
ans += 10*n;
cout<<ans<<endl;
}
return 0;
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
2014在百度之星资格赛的第二个问题Disk Schedule的更多相关文章
- 2014年百度之星资格赛第二题Disk Schedule
Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取. 然而,在现实中,这样的做法非常复杂. 我们考虑一个相对简单的场景. ...
- 2014年百度之星资格赛第三题Xor Sum
Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheus 将向 Zeu ...
- 2014在百度之星资格赛的第四个冠军Labyrinth
Problem Description 熊度仅仅是一种冒险的熊,一个偶然落入一个m*n迷宫矩阵,能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫.每一次仅仅能走一格,且仅仅能向 ...
- 2014年百度之星资格赛第四题Labyrinth
Problem Description 度度熊是一仅仅喜欢探险的熊.一次偶然落进了一个m*n矩阵的迷宫.该迷宫仅仅能从矩阵左上角第一个方格開始走.仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...
- 2014年百度之星资格赛第一题Energy Conversion
Problem Description 魔法师百小度也有遇到难题的时候-- 如今.百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这样的魔法文字须要耗费大量的能量和大量的脑力. 过了许久 ...
- 【2014年百度之星资格赛1001】Energy Conversion
Problem Description 魔法师百小度也有遇到难题的时候—— 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力. 过了许久, ...
- 2014百度之星资格赛——Disk Schedule
2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...
- 2016百度之星 资格赛ABCDE
看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 交题:http://acm.hdu.edu.cn/search.php ...
- HDU 5685:2016"百度之星" - 资格赛 Problem A
原文链接:https://www.dreamwings.cn/hdu5685/2637.html Problem A Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- lucene4.4 索引的增删改查
package com.lucene.test; import java.io.File; import java.io.FileReader; import java.io.IOException; ...
- php 用递归实现的无限级别分类
<?php header("Content-type:text/html; charset=utf-8"); /** * * @category contry_cate ...
- CodeForces 484B Maximum Value
意甲冠军: a序列n(2*10^5)数字 问道a[i]>=a[j]如果是 a[i]%a[j]最大值是多少 思路: 感觉是一道挺乱来的题-- 我们能够将ans表示为a[i]-k*a[j] 这 ...
- CSS3 Media Query实现响应Web设计(宽度为不同的移动设备)
现在的屏幕分辨率.小到320px(iPhone),大到2560px或甚至更高(大显示屏).范围内变化很大.除了使用传统的台式机.用户会越来越多的通过手机.上网本.iPad一类的平板设备来浏览页面. 这 ...
- Java中WebService实例
Web Services是由企业公布的完毕其特定商务需求的在线应用服务,其它公司或应用软件可以通过Internet来訪问并使用这项在线服务. Web Service的关键技术和规则: 1.XML:描写 ...
- hdu2125(数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2125 题意:N×M的网格其中有一条边坏掉了,问从起点到终点的放法数. 分析:数学公式 如果没有坏边的话 ...
- 文件操作ofstream,open,close,ifstream,fin,依照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件
1.ofstream,open,close 写入文件 #include<iostream> #include<fstream> using namespace std; ...
- cocos2d_x_05_Box2D物理引擎
一.认识Box2D 帮助文档,共69页 二.创建一个物理世界 先导入主头文件 #include <Box2D/Box2D.h> 三.物理世界一览 像素转成米 的比例因子 就是32 三.运动 ...
- javascript它【蛇系列】第一弹:简单的蛇实现
参考博客:http://blog.csdn.net/sunxing007/article/details/4187038 上面的博客是一个参考,竟第一次做.真让自己盲人摸象做不出来. 只是我在其上做了 ...
- sql server实现主从复制
测试环境 :主机: 数据库sql server08 r2 系统windows server 2008 r2 IP192.168.1.202 丛机:数据库sql server12 系统window ...