事实上,我认为它可以用来费用流问题。但光建地图上加班。

。。不科学啊。。

因副作用太大,否则,必然在。最后,想啊想,或者使用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的更多相关文章

  1. 2014年百度之星资格赛第二题Disk Schedule

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取. 然而,在现实中,这样的做法非常复杂. 我们考虑一个相对简单的场景. ...

  2. 2014年百度之星资格赛第三题Xor Sum

    Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheus 将向 Zeu ...

  3. 2014在百度之星资格赛的第四个冠军Labyrinth

    Problem Description 熊度仅仅是一种冒险的熊,一个偶然落入一个m*n迷宫矩阵,能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫.每一次仅仅能走一格,且仅仅能向 ...

  4. 2014年百度之星资格赛第四题Labyrinth

    Problem Description 度度熊是一仅仅喜欢探险的熊.一次偶然落进了一个m*n矩阵的迷宫.该迷宫仅仅能从矩阵左上角第一个方格開始走.仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...

  5. 2014年百度之星资格赛第一题Energy Conversion

    Problem Description 魔法师百小度也有遇到难题的时候-- 如今.百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这样的魔法文字须要耗费大量的能量和大量的脑力. 过了许久 ...

  6. 【2014年百度之星资格赛1001】Energy Conversion

    Problem Description 魔法师百小度也有遇到难题的时候—— 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力. 过了许久, ...

  7. 2014百度之星资格赛——Disk Schedule

    2014百度拥有明星格比赛--Disk Schedule Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取. 为了提高效率.须要人为安排磁盘读取. 然而.在 ...

  8. 2016百度之星 资格赛ABCDE

    看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 交题:http://acm.hdu.edu.cn/search.php ...

  9. HDU 5685:2016"百度之星" - 资格赛 Problem A

    原文链接:https://www.dreamwings.cn/hdu5685/2637.html Problem A Time Limit: 2000/1000 MS (Java/Others)    ...

随机推荐

  1. 介绍一个C++奇巧淫技

    你能实现这样一个函数吗:   MyType type;   HisType htype;   serialize_3(11, type, htype);   serialize_4(type, hty ...

  2. hdu 1224 Free DIY Tour(最长的公路/dp)

    http://acm.hdu.edu.cn/showproblem.php? pid=1224 基础的求最长路以及记录路径. 感觉dijstra不及spfa好用,wa了两次. #include < ...

  3. [开源]C#二维码生成解析工具,可添加自定义Logo (转)

    二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字 ...

  4. mysql登录报错 ERROR 1045 (28000)

    1.现象: [root@localhost ~]# mysql -u root -p Enter password:  ERROR 1045 (28000): Access denied for us ...

  5. oracle instr函数

    语法:instr( fatherstr, sonstr [, start_position [, matchtimes ] ] ) fatherstr:父字符串.要在此字符串中查找子字符串的位置. s ...

  6. Android清理设备内存具体完整演示样例(一)

    MainActivity例如以下: package come.on; import android.app.Activity; import android.content.Context; impo ...

  7. hdu2569(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2569 分析: f(n),n个珠子的合格数:a(n),n个珠子,最后2个相同的合格数:b(n),n个珠子 ...

  8. 西南民大oj(递推)

    我的数学不可能那么难推 时间限制(普通/Java) : 3000 MS/ 9000 MS          运行内存限制 : 65536 KByte总提交 : 49            测试通过 : ...

  9. struts2第一个程序的详解(配图)

    首先我们在struts2中要写上一个action <packagename="fish"namespace="/test"extends="st ...

  10. Linux 单用户模式的使用

    在进入系统启动菜单时,选择kernel,输入"e"后进入,在kernel开头的启动项后输入(空格) /single或者 / 1,然后输入"b"重新启动机器,此时 ...