SRM589
250:
给一个串S,可以做这样的操作,可以将串中的一种字母变成另一种字母,代价是该种字母的数量。求解的问题是,最小的代价将串S变成回文串。
根据回文关系,我们可以形成等价对应关系,a与b等价对应说明a和b必须是同种字母,根据这个关系,我们可以得到一个图,每个连通块表示要变成一种相同的字母,而这个操作的最小代价就是将连通块中除出现次数最多的字母全部都转变成出现次数最多的字母。
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
using namespace std; bool mm[][];
int cnt[];
bool used[]; class GooseTattarrattatDiv1 {
public:
int getmin(string S) {
memset(cnt, , sizeof(cnt));
memset(mm, false, sizeof(mm));
memset(used, false, sizeof(used));
int n = S.size();
for (int i = ; i < n; i++) {
mm[S[i]][S[n - - i]] = true;
mm[S[n - - i]][S[i]] = true;
cnt[S[i]]++;
}
int res = ;
for (int i = ; i < ; i++) {
int sum = , max = ; dfs(i, sum, max);
res += (sum - max);
}
return res;
}
void dfs(int i, int& sum, int& max) {
used[i] = true;
sum += cnt[i];
if (cnt[i] > max) max = cnt[i]; for (int j = ; j < ; j++) {
if (mm[i][j] && used[j] == false) {
dfs(j, sum, max);
}
}
}
};
500:
有R,G,B三种齿轮,不同颜色齿轮之间不会相接,相接的关系通过graph给出,同种颜色齿轮旋转方向相同,旋转方向一共有两种:顺时针与逆时针。求解如何去掉最少的齿轮使得该graph能相容,即可以找到某种旋转顺序使得不会发生矛盾(矛盾指相接的两个齿轮旋转方向相同)。
同种颜色的点归于一个集合,因此我们有三个集合,R,G,B,集合内的点不会有边,这个图由三个二分图组成,因为有3个集合,枚举一下齿轮的旋转方向,一共有三种情况:RG同向,GB同向,BR同向。于是问题转换成这三种情况中旋转最小值,对于每个情况,去掉最少的齿轮使其不矛盾便是一个最小点覆盖问题,二分图的最小点覆盖可以转变成二分图的最大匹配问题。
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std; class GearsDiv1 {
private:
vector<int> left, right;
vector<string> G;
bool s[];
int link[];
public:
int getmin(string color, vector <string> graph) {
vector<int> r, g, b;
for (int i = ; i < color.length(); i++) {
if (color[i] == 'R') r.push_back(i);
else if (color[i] == 'G') g.push_back(i);
else if (color[i] == 'B') b.push_back(i);
}
int rg = max_bimatch(r, g, graph);
int gb = max_bimatch(g, b, graph);
int br = max_bimatch(b, r, graph);
return min(rg, min(gb, br));
}
int max_bimatch(vector<int> l, vector<int> r, vector<string> graph) {
//
left = l; right = r; G = graph; int res = ;
memset(link, -, sizeof(link));
for (int i = ; i < left.size(); i++) {
memset(s, false, sizeof(s));
if (dfs(i)) res++;
} return res;
}
bool dfs(int i) {
for (int j = ; j < right.size(); j++) {
if (G[left[i]][right[j]] == 'Y' && s[right[j]] == false) {
s[right[j]] = true;
if (link[right[j]] == - || dfs(link[right[j]])) {
link[right[j]] = i;
return true;
}
}
}
return false;
}
};
SRM589的更多相关文章
- SRM589 DV1 250 回文字符串
其实这道题挺简单的,不过刚开始我钻了一个错误的死胡同.想明白之后才发现. 题目要求用最少的时间来将一个字符串变成回文字符串.(具体题目参看topcoder srm589 DV1 250分值的题目,不便 ...
随机推荐
- [GeekBand] STL与泛型编程(3)
本篇文章主要介绍泛型算法中的变易.排序.数值算法. 一. 变易算法 所谓变易算法是指那些改变容器中的对象的操作. 1.1 copy组 template <class InputIterator, ...
- [EAP]将hostapd作为radius服务器搭建EAP认证环境
文章主要由以下几部分组成: 0.概念理解: WPA/WPA2,EAP,IEEE, 802.11i, WiFi联盟, 802.1x 1.编译hostapd 2.配置hostapd的conf文件 3.外接 ...
- Poj 2993 Emag eht htiw Em Pleh
1.Link: http://poj.org/problem?id=2993 2.Content: Emag eht htiw Em Pleh Time Limit: 1000MS Memory ...
- C语言函数参数既做出参又做入参的代表
//使用fcntl对文件进行加锁 #include "stdio.h"#include "unistd.h"#include "fcntl.h&quo ...
- QMessageBox 弹出框上的按钮设置为中文
Qt 默认的弹出框上的按钮式英文,虽然也知道是什么意思,但终究不如中文看着顺眼. QMessageBox box(QMessageBox::Warning,"标题","弹 ...
- 连续改变Chrome浏览器窗口大小,可以导致内存泄漏
最近在做响应式布局的页面,在开发测试过程中,为了看到页面在不同尺寸的窗口中的表现,因此要不停的拖动浏览器来改变其窗口大小:开始在Chrome浏览器下查看页面,拖动了几次,感觉电脑明显的卡了下来,刚开没 ...
- clrscr( )用法
函数名: clrscr 功 能: 清除文本模式窗口,清屏的意思,即把之前显示出的文字字符去掉,是clear screen的简写 用 法: void clrscr(void); 程序例: #incl ...
- Asp.net之LINQ入门视频教程
当前位置: 主页 > 编程开发 > Asp.net视频教程 > Asp.net之LINQ入门视频教程 > http://www.xin1234.com/Program/Aspn ...
- 【WS-Federation】到底有多少公司在用WS-Federation
到底有多少公司在用WS-Federation? sso先调用一个登录接口 获取一个token 然后再调用各种业务接口 如果是ssl token 直接暴露就行了 没有ssl 最好每次取一个token, ...
- 【BZOJ 2875】 [Noi2012]随机数生成器
Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 Input ...