Codeforces 884f F. Anti-Palindromize
题
OvO http://codeforces.com/contest/884/problem/F
(Educational Codeforces Round 31 - F)
884f
解
题目标签上的 flows 极大降低了难度……
做法:
首先贪心,每个对应的元素对,固定b值比较大的那个元素设为不交换的元素。
然后费用流,2n+2个点,设源点为0,汇点为2n+1
源点向 1 ~ n 的点连一条费用为0,流量为1的边
从 n+1 ~ 2n 向汇点连一条费用为0,流量为1的边
对于每个固定元素,如果他是字符串中第i个元素,则i点向n+i点连一条费用0,流量1的边
对于每个非固定元素对(i,j)(i可以等于j),如果i可以放到到j的位置,则i向j连一条流量为1的边,
如果i=j,则费用为0;否则费用为b[j]
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <string>
#include <queue> using namespace std; const int MAXN = 300;
const int MAXM = 300000;
const int INF = 0x3f3f3f3f; struct Edge
{
int to,next,cap,flow,cost;
}edge[MAXM]; int head[MAXN],tol;
int pre[MAXN],dis[MAXN];
bool vis[MAXN];
int N;//节点总个数,节点编号从0~N-1 void init(int n)
{
N = n;
tol = 0;
memset(head,-1,sizeof(head));
} void addedge(int u,int v,int cap,int cost)
{
edge[tol].to = v;
edge[tol].cap = cap;
edge[tol].cost = cost;
edge[tol].flow = 0;
edge[tol].next = head[u];
head[u] = tol++;
edge[tol].to = u;
edge[tol].cap = 0;
edge[tol].cost = -cost;
edge[tol].flow = 0;
edge[tol].next = head[v];
head[v] = tol++;
} bool spfa(int s,int t)
{
queue<int>q;
for(int i = 0;i < N;i++)
{
dis[i] = INF;
vis[i] = false;
pre[i] = -1;
}
dis[s] = 0;
vis[s] = true;
q.push(s);
while(!q.empty())
{
int u = q.front();
q.pop();
vis[u] = false;
for(int i = head[u]; i != -1;i = edge[i].next)
{
int v = edge[i].to;
if(edge[i].cap > edge[i].flow &&
dis[v] > dis[u] + edge[i].cost )
{
dis[v] = dis[u] + edge[i].cost;
pre[v] = i;
if(!vis[v])
{
vis[v] = true;
q.push(v);
}
}
}
}
if(pre[t] == -1)return false;
else return true;
} int minCostMaxflow(int s,int t,int &cost)
{
int flow = 0;
cost = 0;
while(spfa(s,t))
{
int Min = INF;
for(int i = pre[t];i != -1;i = pre[edge[i^1].to])
{
if(Min > edge[i].cap - edge[i].flow)
Min = edge[i].cap - edge[i].flow;
}
for(int i = pre[t];i != -1;i = pre[edge[i^1].to])
{
edge[i].flow += Min;
edge[i^1].flow -= Min;
cost += edge[i].cost * Min;
}
flow += Min;
}
return flow;
} int n,val[MAXN],fix[MAXN],sum;
char str[MAXN];
int ans; int main()
{
int i,j,s,t,tmp;
scanf("%d",&n);
init(2*n+2);
s=0; t=2*n+1;
scanf("%s",str+1);
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",&val[i]);
sum+=val[i];
}
memset(fix,0,sizeof(fix));
for(i=1;i<=n/2;i++)
if(val[i]>val[n+1-i])
fix[i]=1,addedge(i,n+i,1,0);
else
fix[n+1-i]=1,addedge((n+1-i),n+(n+1-i),1,0);
for(i=1;i<=n;i++)
addedge(s,i,1,0),addedge(n+i,t,1,0);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(fix[i] || fix[j])
continue;
if(str[i]==str[n+1-j])
continue;
if(i==j) tmp=0;
else tmp=val[j];
addedge(i,n+j,1,tmp);
}
int flow=minCostMaxflow(s,t,ans);
ans=sum-ans;
printf("%d\n",ans);
return 0;
}
Codeforces 884f F. Anti-Palindromize的更多相关文章
- Codeforces 959 F. Mahmoud and Ehab and yet another xor task
\(>Codeforces\space959 F. Mahmoud\ and\ Ehab\ and\ yet\ another\ xor\ task<\) 题目大意 : 给出一个长度为 \ ...
- Codeforces 835 F. Roads in the Kingdom
\(>Codeforces\space835 F. Roads in the Kingdom<\) 题目大意 : 给你一棵 \(n\) 个点构成的树基环树,你需要删掉一条环边,使其变成一颗 ...
- Codeforces 731 F. Video Cards(前缀和)
Codeforces 731 F. Video Cards 题目大意:给一组数,从中选一个数作lead,要求其他所有数减少为其倍数,再求和.问所求和的最大值. 思路:统计每个数字出现的个数,再做前缀和 ...
- Codeforces 797 F Mice and Holes
http://codeforces.com/problemset/problem/797/F F. Mice and Holes time limit per test 1.5 ...
- Codeforces 622 F. The Sum of the k-th Powers
\(>Codeforces \space 622\ F. The\ Sum\ of\ the\ k-th\ Powers<\) 题目大意 : 给出 \(n, k\),求 \(\sum_{i ...
- Codeforces 379 F. New Year Tree
\(>Codeforces \space 379 F. New Year Tree<\) 题目大意 : 有一棵有 \(4\) 个节点个树,有连边 \((1,2) (1,3) (1,4)\) ...
- Codeforces 538 F. A Heap of Heaps
\(>Codeforces \space 538 F. A Heap of Heaps<\) 题目大意 :给出 \(n\) 个点,编号为 \(1 - n\) ,每个点有点权,将这些点构建成 ...
- codeforces 825F F. String Compression dp+kmp找字符串的最小循环节
/** 题目:F. String Compression 链接:http://codeforces.com/problemset/problem/825/F 题意:压缩字符串后求最小长度. 思路: d ...
- [codeforces 618 F] Double Knapsack (抽屉原理)
题目链接:http://codeforces.com/contest/618/problem/F 题目: 题目大意: 有两个大小为 N 的可重集 A, B, 每个元素都在 1 到 N 之间. 分别找出 ...
随机推荐
- 【Python】【demo实验19】【练习实例】【不同位数相同阿拉伯数字组成的数之和】
原题: 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制. 我的代码: #!/usr/bin ...
- Win7/Win2008下IIS配置Asp站点启用父路径的设置方法
iis日志错误如下: 修改路径文件权限问题依旧. 解决方式:
- MongoDB对数组元素及内嵌文档进行增删改查操作
比如我有一个user类,他包含一个标签属性,这个标签是一个数组,数组里面的元素是内嵌文档,格式如下: { "_id" : "195861", &qu ...
- Linux就该这么学——重要的环境变量
Linux命令执行过程 1.判断用户是否以绝对路径或相对路径的方式输入命令(如 /bin/ls) ,如果是的话则直接执行 2.Linux系统检查用户输入的命令是否为”别名命令”. 即用一个自定义的命令 ...
- sysbench测试
什么是基准测试 数据库的基准测试是对数据库的性能指标进行定量的.可复现的.可对比的测试. 基准测试与压力测试 基准测试可以理解为针对系统的一种压力测试.但基准测试不关心业务逻辑,更加简单.直接.易于测 ...
- 协议相关(HTTP,TCP,webservice,socket)
什么是协议? 我们常常点开的链接(URL)就有HTTP.HTTPS协议 枯燥点的知识(协议模型) HTTP,webservice都是在<TCP/IP协议>的应用层. TCP,socket在 ...
- Jmeter之梯度式加压(Stepping Thread Group)
1.添加线程组(Stepping Thread Group) 2.设置数据 学习参考网址:https://www.cnblogs.com/imyalost/p/7658816.html 这个大大的 ...
- C#面向对象19 值传递和引用传递
值类型:int double char decimal bool enum struct引用类型:string 数组 自定义类 集合 object 接口 **值传递和引用传递1.值类型在复制的时候,传 ...
- JS基础_嵌套的for循环
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- element-ui 中日期控件限制时间跨度
支持点击今天及之前任意日期,前后跨度不超过31天,且不超过今天 <el-date-picker v-model="searchForm.dateRange" type=&qu ...