Codeforces 132E Bits of merry old England 【最小费用最大流】
题意:
让你输出长度为n的某个序列,然后给你m个变量。
每次给某个数赋值的代价是
假设赋值a=7那么代价是3,因为7的二进制位中有3个1。
要求最后总代价最小。
输出总共要进行操作的次数,和最小代价。
先吐槽下,早期的cf题很多没有官方题解,只找到两篇中文题解...第一篇完全没搞懂大神再说什么。建图的方法是在第二篇中受到启发【虽然也没搞懂大神在说什么】
首先说下这题对我的启示:
1.现在对状态这个词越发有深的理解了,很多题目只要理解了某个抽象意义上的状态,加上他们之间的转换的方式【也有很多人说是序的因素】就基本上可以解决了。
2.费用流的计算方式是一整条路径上权值的总和。一开始建了个傻逼的图,感觉弱爆了。
思路:
这题的状态是这样的,对于每一个需要输出的数字来说,它要输出无非有两种来源,一种是选择之前没有赋值过的变量,另外一种是选择之前已经赋值的变量。问题在于当当前要输出的数字选择的变量是之前已经赋值的变量的时候,花费有两种情况,一种是之前已经赋值过相同的值了,另外一种是赋值不同,这两种情况下的花费是不一样的。对于之前已经打印过的数字来说,它的变量只能向以后的某一次操作转变,【因为如果以后不同的数字使用这个变量的话本身就没有意义了,假如下次使用这个变量是一个相同的数字的话我们认为是后来刚打印的数字的状态这种情况下跟原来是等价的】。
一开始可能存在没有被使用的变量这个时候我们可以贪心,当前有变量没有被使用那么我们使用新的变量就是了,假如之前没有相同的数字。
除了源汇外一共两组点,左边是变量和每个数字,右边是数字。【关键是将数字分成两部分了】然后建图就可以根据上边解释的干了。
#include<bits/stdc++.h>
#define MAXN 800
#define MAXM 80002
#define INF 0x3f3f3f3f
using namespace std;
int cost[],jilu[],aans[];
int zong;
bool vis[MAXN];
struct edge{
edge *next,*op;
int t,c,v;
}ES[MAXM],*V[MAXN];
int N,M,S,T,EC=-;
int demond[MAXN],sp[MAXN],prev[MAXN];
edge *path[MAXN];
void addedge(int a,int b,int v,int c=INF){
//printf("%d %d %d %d\n",a,b,v,c);
edge e1={V[a],,b,c,v},e2={V[b],,a,,-v};
ES[++EC]=e1;V[a]=&ES[EC];
ES[++EC]=e2;V[b]=&ES[EC];
V[a]->op=V[b];V[b]->op=V[a];
}
bool SPFA(){
int u,v;
for(u=S;u<=T;u++){
sp[u]=INF;
}
queue<int>q;
prev[S]=-;
q.push(S);
sp[S]=;
vis[S]=;
while(!q.empty()){
u=q.front();
vis[u]=;
q.pop();
for(edge *k=V[u];k;k=k->next){
v=k->t;
if(k->c>&&sp[u]+k->v<sp[v]){
sp[v]=sp[u]+k->v;
prev[v]=u;
path[v]=k;
if(vis[v]==){
vis[v]=;
q.push(v);
}
}
}
}
return sp[T]!=INF;
}
int argument(){
int i,cost=INF,flow=;
edge *e;
for(i=T;prev[i]!=-;i=prev[i]){
e=path[i];
if(e->c<cost)cost=e->c;
}
for(int i=T;prev[i]!=-;i=prev[i]){
e=path[i];
e->c-=cost;e->op->c+=cost;
flow+=e->v*cost;
}
return flow;
}
int maxcostflow(){
int Flow=;
while(SPFA()){
Flow+=argument();
}
return Flow;
}
int n,m;
void init(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&jilu[i]);
for(int j=;j<;j++){
if((jilu[i]>>j)&)cost[i]++;
}
}
S=;T=n+n+m+;
vector<int>bef;
for(int i=,j=;i<=n&&j<=m;i++){
bool ok=;
for(int k=;k<bef.size();k++){
if(bef[k]==jilu[i]){
ok=;break;
}
}
if(ok){
bef.push_back(jilu[i]);
addedge(j+n,i,cost[i],);
j++;
}
}
for(int i=;i<=n;i++){
addedge(i,T,,);
addedge(S,i+n+m,,);
}
for(int i=n+;i<=n+m;i++){
addedge(S,i,,);
}
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++){
if(jilu[i]==jilu[j])addedge(i+n+m,j,,);
else addedge(i+n+m,j,cost[j],);
}
}
zong=n;
}
int main()
{
init();
int ans=maxcostflow();
for(int i=;i<=n;i++){
for(edge *k=V[i];k;k=k->next){
if(k->t>n){
if(k->v!=&&k->c!=){
zong++;
}
}
}
}
printf("%d %d\n",zong,ans);
for(int i=;i<=n;i++){
for(edge *k=V[i];k;k=k->next){
if(k->c!=){
bool ok=;
if(k->v==)ok=;
if(k->t<=n+m){
printf("%c=%d\n",'a'-+k->t-n,jilu[i]);
printf("print(%c)\n",'a'-+k->t-n);
aans[k->t-n]=jilu[i];
}
else{
for(int j=;j<=m;j++){
if(aans[j]==jilu[k->t-n-m]){
//puts("======");
if(ok)printf("%c=%d\n",'a'-+j,jilu[i]);
printf("print(%c)\n",'a'-+j);
aans[j]=jilu[i];
break;
}
}
}
break;
}
}
}
}
Codeforces 132E Bits of merry old England 【最小费用最大流】的更多相关文章
- UVA 1658 海军上将(拆点法+最小费用限制流)
海军上将 紫书P375 这题我觉得有2个难点: 一是拆点,要有足够的想法才能把这题用网络流建模,并且知道如何拆点. 二是最小费用限制流,最小费用最大流我们都会,但如果限制流必须为一个值呢?比如这题限制 ...
- Luogu P3381 (模板题) 最小费用最大流
<题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...
- Luogu--3381 【模板】最小费用最大流
题目链接 3381 [模板]最小费用最大流 手写堆版本 dijkstra 400+ms 看来优先队列的常数好大 #include<bits/stdc++.h> using namesp ...
- HDU5988/nowcoder 207G - Coding Contest - [最小费用最大流]
题目链接:https://www.nowcoder.com/acm/contest/207/G 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5988 ...
- nowcoder 206A - Birthday - [最小费用最大流]
题目链接:https://www.nowcoder.com/acm/contest/206/A 题目描述 恬恬的生日临近了.宇扬给她准备了一个蛋糕.正如往常一样,宇扬在蛋糕上插了n支蜡烛,并把蛋糕分为 ...
- HDU 6118 度度熊的交易计划(最小费用最大流)
Problem Description度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个 ...
- TZOJ 4712 Double Shortest Paths(最小费用最大流)
描述 Alice and Bob are walking in an ancient maze with a lot of caves and one-way passages connecting ...
- TZOJ 1513 Farm Tour(最小费用最大流)
描述 When FJ's friends visit him on the farm, he likes to show them around. His farm comprises N (1 &l ...
- 2018牛客网暑期ACM多校训练营(第五场) E - room - [最小费用最大流模板题]
题目链接:https://www.nowcoder.com/acm/contest/143/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
随机推荐
- 【转载】onclick与onCommand的区别
这两个事件没有本质区别,都是点击执行一个事件.不同在于传递的参数不一 样,OnClick (object sender, EventArgs e),OnCommand (object sender, ...
- PostgreSQL数据的导出导入
PostgreSQL数据的导出导入 导出PostgreSQL数据库中的数据: $ pg_dump -U postgres -f mydatabase.sql mydatabase 导入数据时首先创 ...
- CentOS6.4系统启动失败故障排查
转:http://www.centoscn.com/CentosBug/osbug/2014/1028/4011.html 操作系统启动失败如下图报错: 故障现象: 从图中可以看到,操作系统启动的过程 ...
- 【转】.NET多种WebKit内核/Blink内核浏览器初步测评报告
第1篇:.NET多种WebKit内核/Blink内核浏览器初步测评报告 本文转自“吾乐吧软件站”,原文链接:http://www.wuleba.com/?p=23590 报告研究时间:2013-10- ...
- EditText的圆角与边框
先看一下效果图: 先创建一个xml文件edittext_shape.xml: <?xml version="1.0" encoding="utf-8"?& ...
- Redis Cluster 在PHP上的实践
版本:redis3.0.3 redis——slot: 'master' => [ '192.168.1.55:7000'=>[0,5460], '192.168.1.55:7001'=&g ...
- TP控制器(Controller)
控制器的一些方法: Maincontroller.class.php文件: <?php namespace Home\Controller; use Think\Controller; clas ...
- Java异常之checked与unchecked
首先,java的异常分为Error和Exception.这两类都是接口Throwable的子类.Error及Exception及其子类之间的关系,大致可以用下图简述. 注意事项: 1. Error仅在 ...
- 创建UIImage的两种方法
1. UIImage *img = [UIImage imageNamed:@"imageName"]; 2. NSString *imageFilePath = [[NSBund ...
- Neutron Networking QoS
目前,Neutron有一个QoS的proposal(https://wiki.openstack.org/wiki/Neutron/QoS#Documents),但是只有Ciscso和NVP插件实现了 ...