【TopCoder】SRM 680 DIV 2
1. BearPair之bigDistance
1.1 题目概述
在 <= 50的字符串中找位置i,j 满足
(1) s[i] != s[j];
(2) abs(i-j)尽可能大。
若不存在返回-1, 否则返回最大值。
1.2 基本思路
没什么好说的,串长这么短 O(n^2)直接A了。
1.3 代码
class BearPair {
public:
int pos[];
int bigDistance(string s) {
int len = s.length();
int mx = -;
rep(i, , len) {
rep(j, , len) {
if (s[j]==s[i])
continue;
mx = max(mx, abs(j-i));
}
}
return mx;
}
};
2. BearChairs之findPositions
2.1 题目描述
一家餐馆,椅子排成一行从1开始,足够长,有N个元素的数组atLeast表示第i个顾客希望他的椅子编号大于等于atLeast[i]。
同时,需要保证任意两个顾客的椅子间相隔至少为d,并且顾客最终得到的椅子编号越小越好。这里,顾客的请求是有序的。
求最终的椅子编号。
2.2 基本思路
基本想法是贪心,第k个顾客最好的可能性是得到atLeast[k]编号的椅子。
如果此时该顾客与前k-1个顾客的间隔都大于等于d,那么答案就是atLeast[k]。
假设不满足,如果我们可以使前k-1个顾客的椅子编号按升序排列,那么当answer[j]-d<answer[k] && answer[k]<answer[j]+d
时,下一个最优的候选项即为answer[j]+d,而该候选项一定满足answer[1..j]。仅需判断其是否满足answer[j+1..k-1]即可。
因此,使用set维护已经确定的最优位置,即可解。
2.3 代码
class BearChairs {
public:
static const int maxn = ;
vi findPositions(vi vc, int d) {
int sz = SZ(vc), tmp;
vi ret;
sti st;
sti::iterator iter;
rep(i, , sz) {
int pos = vc[i];
for (iter=st.begin(); iter!=st.end(); ++iter) {
tmp = *iter;
if (tmp-d<pos && pos<tmp+d) {
pos = tmp + d;
}
}
ret.pb(pos);
st.insert(pos);
}
return ret;
}
};
2.4 数据发生器
import sys
import string
from random import randint def GenData(fileName):
with open(fileName, "w") as fout:
t = 1
bound = 10**6
# fout.write("%d\n" % (t))
for tt in xrange(t):
n = randint(1, 1000)
atLeast = []
for i in xrange(n):
x = randint(1, bound)
atLeast.append(x)
fout.write(" ".join(map(str, atLeast)) + "\n")
d = randint(1, 10**6)
fout.write("%d\n" % (d)) def MovData(srcFileName, desFileName):
with open(srcFileName, "r") as fin:
lines = fin.readlines()
with open(desFileName, "w") as fout:
fout.write("".join(lines)) def CompData():
print "comp"
srcFileName = "F:\Qt_prj\hdoj\data.out"
desFileName = "F:\workspace\cpp_hdoj\data.out"
srcLines = []
desLines = []
with open(srcFileName, "r") as fin:
srcLines = fin.readlines()
with open(desFileName, "r") as fin:
desLines = fin.readlines()
n = min(len(srcLines), len(desLines))-1
for i in xrange(n):
ans2 = int(desLines[i])
ans1 = int(srcLines[i])
if ans1 > ans2:
print "%d: wrong" % i if __name__ == "__main__":
srcFileName = "F:\Qt_prj\hdoj\data.in"
desFileName = "F:\workspace\cpp_hdoj\data.in"
GenData(srcFileName)
MovData(srcFileName, desFileName)
3. BearFair2之isFair
3.1 题目描述
有一个包含n(n%3 == 0)个元素的集合,其中的元素都在[1,b]区间,其中mod3等于0、1、2的元素个数均为n/3。
现有两个长度均为q数组upTo, quantity表示集合中的元素在区间[1, upTo[i]]的数目为quantity[i]。
判定是否存在这样一个集合满足upTo和quantity。
其中upTo的元素在[1,b]区间内,quantity的元素在[1,n]区间内,b在区间[1,1000]内。
3.2 基本思路
这是一个判定问题,首先以upTo作为first, quantity作为second重新构建pair数组,排序后,可以做初步的剪枝。
但仍需进一步判定是否存在这样的集合。基本思路是网络流,难点是如何构建图。
对pair树组的每个结点编号1001...1001+q-1
对1..b编号为1...b
对%3==0作结点mod0
对%3==1作结点mod1
对%3==2作结点mod2
可以这样建图:
1)st对pair结点建边,容量为对应的quantity[i]-quantity[i-1];
2)pair结点对它包含的区间中的每个结点建边,容量为1;
3)编号1..b对其对应的modx建边,容量为1;
4)modx对ed建边,容量为n/3。
需要注意pair数组可能没有覆盖[1,b],对余下的区间仍需要建边,与上述类似。
然后,判定最大流是否为n即可。
使用Dinic解该网络流。
3.3 代码
class BearFair2 {
typedef struct {
int v, f, nxt;
} edge_t;
public:
static const int INF = 0x3f3f3f3f;
static const int maxv = ;
static const int maxe = 1e5+;
static const int st = maxv - ;
static const int ed = maxv - ;
static const int mod0 = maxv - ;
static const int mod1 = maxv - ;
static const int mod2 = maxv - ;
int head_[maxv];
int head[maxv], l;
int Q[maxv];
int dis[maxv];
edge_t E[maxe];
int n, b;
void init() {
memset(head, -, sizeof(head));
l = ;
}
void addEdge(int u, int v, int c) {
E[l].v = v;
E[l].f = c;
E[l].nxt = head[u];
head[u] = l++;
E[l].v = u;
E[l].f = ;
E[l].nxt = head[v];
head[v] = l++;
}
bool bfs() {
int l = , r = ;
int u, v, k;
memset(dis, , sizeof(dis));
Q[r++] = st;
dis[st] = ;
while (l < r) {
u = Q[l++];
for (k=head[u]; k!=-; k=E[k].nxt) {
v = E[k].v;
if (E[k].f && !dis[v]) {
dis[v] = dis[u] + ;
if (v == ed)
return false;
Q[r++] = v;
}
}
}
return true;
}
int dfs(int u, int val) {
if (val== || u==ed)
return val;
int ret = , tmp;
int v;
for (int& k=head_[u]; k!=-; k=E[k].nxt) {
v = E[k].v;
if (E[k].f && dis[v]==dis[u]+ && (tmp=dfs(v, min(val, E[k].f)))>) {
ret += tmp;
val -= tmp;
E[k].f -= tmp;
E[k^].f += tmp;
if (val == )
break;
}
}
return ret;
}
int Dinic() {
int ret = , tmp;
while () {
if (bfs())
break;
memcpy(head_, head, sizeof(head));
while () {
tmp = dfs(st, INF);
if (tmp == )
break;
ret += tmp;
}
}
return ret;
}
string isFair(int n, int b, vector <int> upTo, vector <int> quan) {
this->n = n;
this->b = b;
init();
vpii vp;
int sz = SZ(upTo);
rep(i, , sz) {
vp.pb(mp(upTo[i], quan[i]));
}
sort(all(vp));
rep(i, , sz) {
if (vp[i].sec > vp[i].sec)
return "unfair";
if (i && vp[i].sec<vp[i-].sec)
return "unfair";
if (i && vp[i].fir==vp[i-].fir && vp[i].sec!=vp[i-].sec)
return "unfair";
}
int fr = , pm = ;
rep(i, , sz) {
addEdge(st, +i, vp[i].sec-pm);
while (fr <= vp[i].fir) {
addEdge(+i, fr, );
++fr;
}
pm = vp[i].sec;
}
if (fr <= b) {
addEdge(st, +sz, n-pm);
while (fr <= b) {
addEdge(+sz, fr, );
++fr;
}
}
for (int i=; i<=b; i+=)
addEdge(i, mod1, );
for (int i=; i<=b; i+=)
addEdge(i, mod2, );
for (int i=; i<=b; i+=)
addEdge(i, mod0, );
addEdge(mod0, ed, n/);
addEdge(mod1, ed, n/);
addEdge(mod2, ed, n/);
int flow = ;
flow = Dinic();
if (flow == n)
return "fair";
else
return "unfair";
}
};
3.4 数据发生器
import sys
import string
from random import randint def GenData(fileName):
with open(fileName, "w") as fout:
t = 1
bound = 10**6
# fout.write("%d\n" % (t))
for tt in xrange(t):
n = randint(1, 16) * 3
b = randint(1, n)
fout.write("%d %d\n" % (n, b))
q = randint(1, 50)
upTo = []
for i in xrange(q):
x = randint(1, b)
upTo.append(x)
fout.write(" ".join(map(str, upTo)) + "\n")
quantity = []
for i in xrange(q):
x = randint(0, n)
quantity.append(x)
fout.write(" ".join(map(str, quantity)) + "\n") def MovData(srcFileName, desFileName):
with open(srcFileName, "r") as fin:
lines = fin.readlines()
with open(desFileName, "w") as fout:
fout.write("".join(lines)) def CompData():
print "comp"
srcFileName = "F:\Qt_prj\hdoj\data.out"
desFileName = "F:\workspace\cpp_hdoj\data.out"
srcLines = []
desLines = []
with open(srcFileName, "r") as fin:
srcLines = fin.readlines()
with open(desFileName, "r") as fin:
desLines = fin.readlines()
n = min(len(srcLines), len(desLines))-1
for i in xrange(n):
ans2 = int(desLines[i])
ans1 = int(srcLines[i])
if ans1 > ans2:
print "%d: wrong" % i if __name__ == "__main__":
srcFileName = "F:\Qt_prj\hdoj\data.in"
desFileName = "F:\workspace\cpp_hdoj\data.in"
GenData(srcFileName)
MovData(srcFileName, desFileName)
【TopCoder】SRM 680 DIV 2的更多相关文章
- 【Codeforces】Round #491 (Div. 2) 总结
[Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...
- 【Codeforces】Round #488 (Div. 2) 总结
[Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...
- 【转】CSS设置DIV背景色渐变显示
[原链接]http://www.2cto.com/kf/201310/248187.html <style type="text/css"> .linear{ ...
- CSS-布局【1】-图片在div中垂直居中
方法一:通过增加100%高度行内块居中对齐 <!DOCTYPE html> <html> <head> <meta name="viewport&q ...
- 【转】如何让DIV水平和垂直居中
来源:http://blog.163.com/www.wxs_123/blog/static/82784664201321831746921/ 我们在设计页面的时候,经常要把DIV居中显示,而且是相对 ...
- 【转】CSS实现div的高度填满剩余空间
转自:http://www.cnblogs.com/zhujl/archive/2012/03/20/2408976.html 高度自适应问题,我很抵触用js去解决,因为不好维护,也不够自然,但是纯用 ...
- 【转】网页窗口DIV自定义拖动
一个来自网上的东西- -被我捡到了 然后我访问到了 发出来就可以粘贴复制自己做成js文件了吧 // by zhangxinxu welcome to visit my personal website ...
- 【TopCoder】SRM151 DIV2 练习总结
第一次做完整的SRM题,刷完感觉萌萌哒,不过自己对java中很多细节不熟练,还要边做题边google. 250分的题:判断字符串序列是否是前缀码,如果不是,返回第一个违反前缀码规则的字符串. 简单的暴 ...
- 【jQuery01】添加添加div
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- hadoop下跑mapreduce程序报错
mapreduce真的是门学问,遇到的问题逼着我把它从MRv1摸索到MRv2,从年前就牵挂在心里,连过年回家的旅途上都是心情凝重,今天终于在eclipse控制台看到了job completed suc ...
- FileStream使用小记
流用于对IO处理 在System.IO名称空间中有以下类 BinaryReader/Writer TextReader/Writer Stream 其中类Stream为抽象类.由此有三个派生类: Me ...
- android 软件开机自启动
安卓的很多功能实现方式都是“Don't call me, I'll call you back!”,开机启动就是其中之一 步骤: 1.首先建立一个BroadcastReceiver, 2.在他的onR ...
- C++ 编写 CorelDRAW CPG 插件例子(1)—WelcomeScreen
据我所知,这是国外论坛最早的一个例子,原贴在此:http://forum.oberonplace.com/showthread.php?t=1880&highlight=Plugins 贴上主 ...
- Django工程读取mongodb并使用分页器
pycharm开发django工程(二) 项目需求: 1. 从mongodb中读取数据,并显示到网页中 2. 在网页显示的每一页加入分页符 首先使用pycharm的企业版新建一个django的虚拟工程 ...
- DataGridView控件-学习笔记总结
1.GridColor属性用来获取或设置网格线的颜色 dataGridView1.GridColor=Color.Blue; 2.设置宽度 .高度 dataGridView1.Columns[].Wi ...
- WebApi2 jsonp跨域问题
一:故事背景 以前在写WebApi2的时候,一直是用作前后端分离(WebApi2 +angularjs),可是最近自己在给WebApp写接口的时候遇到了很多坑,总结一下就是跨域问题.而跨域问题 ...
- multimap和multiset 认知和使用
之前只是在C++ Primer里面看过关联容器,可能因为没有实际用过,只是看看,所以导致用的时候并不熟悉: 在这之前,map和set的特性应该要了解,map是关联数组,也就是由键值对组成的,而set只 ...
- ios设备 分辨率(转)
1 iOS设备的分辨率 iOS设备,目前最主要的有3种(Apple TV等不在此讨论),按分辨率分为两类 iPhone/iPod Touch 普屏分辨率 320像素 x 480像素 Retina ...
- linux下nginx的安装
一.安装nginx 1.在nginx官方网站下载一个包,下载地址是:http://nginx.org/en/download.html 2.WinSCP(ftp上传工具).exe FT ...