hackerrank Ticket

题意:n个人排队买票,要把他们拆成k条队到k个窗口买,可以有队伍为空,每条队的顺序保持拆之前的顺序。如果某人和他前一个人买的票相同,就可以打八折,求最小花费。
题解:拆成k条队意味着只有[n-k,n-1]组前后关系,那么可以转成二分图最大权匹配,流的时候限制流量在[n-k,n-1]间就可以了。
#include<map>
#include<queue>
#include<string>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 5300
#define MAXM 35000
using namespace std; struct na{
int y,z,f,ne;
};
int n,m,k,l[MAXN],r[MAXN],num=,p,ch,S,T,dis[MAXN],mi[MAXN],ro[MAXN],qi[MAXN],no,v[MAXN],R[MAXN],Ro[][],li[];
na b[MAXM];
bool bo[MAXN];
const int INF=1e9;
int mmh=,an=;
queue<int> q;
inline int min(int x,int y){return x>y?y:x;}
inline void spfa(){
register int i;
q.push(S);
bo[S]=;
for (i=;i<=no;i++) dis[i]=INF;
mi[S]=INF;dis[S]=;dis[T]=INF;
while(!q.empty()){
int k=q.front();q.pop();bo[k]=;
if (k==T) continue;
for (i=l[k];i;i=b[i].ne){
if (b[i].z>&&dis[b[i].y]>b[i].f+dis[k]){
dis[b[i].y]=b[i].f+dis[k];
mi[b[i].y]=min(mi[k],b[i].z);
ro[b[i].y]=i;
qi[b[i].y]=k;
if (!bo[b[i].y]){
bo[b[i].y]=;
q.push(b[i].y);
}
}
}
}
}
inline int read(){
p=;ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') p=p*+ch-, ch=getchar();
return p;
}
inline void add(int x,int y,int z,int f){
num++;
if (l[x]==) l[x]=num;else b[r[x]].ne=num;
b[num].y=y;b[num].z=z;b[num].f=f;r[x]=num;
}
inline void in(int x,int y,int z,int f){
add(x,y,z,f);add(y,x,,-f);
}
map<string,int> ma;
char s[];
int main(){
register int i,j;
n=read();m=read();k=read();S=;no=T=n+n+;
for (i=;i<=k;i++){
scanf("%s",s);
ma[string(s)]=i;
v[i]=read();
}
for (i=;i<=n;i++) scanf("%s",s),R[i]=ma[string(s)],mmh+=v[R[i]],in(S,i,,),in(i+n,T,,);
for (i=;i<=n;i++)
for (j=i+;j<=n;j++) in(i,j+n,,R[i]==R[j]?-v[R[j]]:),Ro[i][j]=num-;
for (int f=;;f++){
spfa();
if (dis[T]==INF) break;
if (dis[T]>=&&f>=n-m) break;
an+=mi[T]*dis[T];
for (i=T;i;i=qi[i]) b[ro[i]].z-=mi[T],b[((ro[i]-)^)+].z+=mi[T];
}
printf("%lf\n",.*mmh+0.2*an);
int s=;
for (i=;i<=n;i++){
for (j=;j<i;j++)
if (b[Ro[j][i]].z==) break;
if (j==i) li[i]=++s;else li[i]=li[j];
printf("%d\n",li[i]);
}
}
hackerrank Ticket的更多相关文章
- [Kerberos] User Ticket Management
Kerberos客户端常用命令包括 kinit, klist, kdestroy, and kpasswd,用户使用这些命令管理自己的 ticket. 此外,每台运行Kerberos的机器应该都配置/ ...
- 日常小测:颜色 && Hackerrank Unique_colors
题目传送门:https://www.hackerrank.com/challenges/unique-colors 感谢hzq大神找来的这道题. 考虑点分治(毕竟是路经统计),对于每一个颜色,它的贡献 ...
- 實際案例: 獲取臨時票証 (JsApi Ticket)
專案中選用大名鼎鼎的 Senparc 微信開發套件 獲取臨時票證處理常式的程式碼 (GetgVXinInfo.ashx) using Senparc.Weixin; using Senparc.Wei ...
- Gitblit中采用Ticket模式进行协作开发
Git目前的代码分支管理模型中,比较主要的有Git-Flow.Github Pull Request.大家日常或多或少都在用着. 在不想安装Gitlab这种重量级的环境的情况下,如果是利用git一步步 ...
- Buy the Ticket{HDU1133}
Buy the TicketTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HackerRank "Square Subsequences" !!!
Firt thought: an variation to LCS problem - but this one has many tricky detail. I learnt the soluti ...
- HackerRank "Minimum Penalty Path"
It is about how to choose btw. BFS and DFS. My init thought was to DFS - TLE\MLE. And its editorial ...
- HackerRank "TBS Problem" ~ NPC
It is marked as a NPC problem. However from the #1 code submission (https://www.hackerrank.com/Charl ...
- 基于ticket的rw锁
代码: wiredtiger-2.8.0/src/os_posix/os_mtx_rw.c rw锁结构 struct { uint16_t writers; // Now serving for wr ...
随机推荐
- 变量声明declare,简单运算符运算,变量测试与内容替换
declare -/+ 选项 变量名 - 设类型 + 取消类型 -i 设为整型 -x 设为环境变量 -p 显示类型属性(property) [root@localhost ~]# a= [root@l ...
- 【python】函数闭包
列表时可以改
- js判断文件类型大小并给出提示
上传文件是工作中常用的功能,不同的场景对不同的文件类型和文件大小都有不同的要求: <form id="uploadForm" method="post" ...
- scala写算法-List、Stream、以及剑指Offer里部分题目基于scala解法
Stream(immutable) Stream是惰性列表.实现细节涉及到lazy懒惰求值.传名参数等等技术(具体细节详见维基百科-求值策略). Stream和List是scala中严格求值和非严格求 ...
- php多语言切换---转载
文件内容: /include/language.php <?php $languages = array (); $languages ['zh-cn'] ["name"] ...
- 未来五年什么样的IT技术最具颠覆性?这里有你想知道的答案
据外媒报道称,近日Gartner研讨会在美国弗罗里达州奥兰多举行,智能化.大数据和物联网成为届研讨会的三大主题.市场研究机构Gartner Research的副总裁兼资深研究员大卫·卡利(David ...
- springBoot系列教程05:fastjson的集成、配置及使用
springBoot自带的json用着不太习惯,已习惯了fastJSON,下面介绍下fastjson的配置 1. pom引入 <dependency> <groupId>com ...
- C# Log4net记录日志
前言 1.需求 需求很简单,就是在C#开发中高速写日志.比如在高并发,高流量的地方需要写日志.我们知道程序在操作磁盘时是比较耗时的,所以我们把日志写到磁盘上会有一定的时间耗在上面,这些并不是我们想看到 ...
- 房上的猫:if选择结构
一.基本if结构: 1.定义:if选择结构是根据条件判断之后再做处理的一种语法结构! 2.逻辑:首先对条件进行判断 >如果为真,则执行代码块 >如果为假,执行代码块后面的部分二.常用逻 ...
- MySQL字符串相关函数学习一
这里总结一下常用的或者有可能用到的一些字符串内建函数 ① ASCII() :返回字符的ASCII码 如果输入的不是一个字符而是一个字符串呢?ascii()会只取第一个字符作为计算的参数,如: ② CH ...