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 ...
随机推荐
- dwr使用步骤
DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站.它可以允许在浏览器里的代码使用运行在 ...
- Spring MVC与Struts2的区别
1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同. 2. 性能:spring会稍微比struts快.spring mvc是基于方法的设 ...
- 转: 从Mysql某一表中随机读取n条数据的SQL查询语句
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...
- 类找不到异常 Caused by: java.lang.NoClassDefFoundError
错误原因:在部署应用的时候,服务器报错,Caused by: java.lang.ClassNotFoundException: org.quartz.impl.JobDetailImpl,某个类找不 ...
- DIV+CSS命名规范-转载1
命名规则说明: 1).所有的命名最好都小写 2).属性的值一定要用双引号("")括起来,且一定要有值如class="divcss5",id="divc ...
- android操作sdcard中的多媒体文件(一)——音乐列表的制作
android操作sdcard中的多媒体文件(一)——音乐列表的制作 原文地址 最近做了一个android音乐播放器,个人感觉最难的就是“后台播放”以及有关“播放列表”的部分,但是总算是找到了实现的方 ...
- JAVA解析各种编码密钥对(DER、PEM、openssh公钥)
一.DER编码密钥对 先说下DER编码,是因为JCE本身是支持DER编码密钥对的解析的,可以参见PKCS8EncodedKeySpec和X509EncodedKeySpec. DER编码是ASN.1编 ...
- IOS开发-PCH文件的使用
PCH文件存储一些共享的数据,在其他的文件可以直接使用,这样减少程序输入,比如存储宏定义 1.首先新建PCH文件 2.建立完毕 3.在这里找到文件路径 4.进入targets 点击Build Sttt ...
- DEBUG测试
这几天看一个ros软路由的的API借口的C++实现看到一个关于DEBUG的测试,第一次见,感觉挺实用的,记录一下: #include<iostream> #include <stdi ...
- java 反射机制01
// */ // ]]> java反射机制01 Table of Contents 1 反射机制 2 反射成员 2.1 java.lang.Class 2.2 Constructor 2.3 ...