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的更多相关文章

  1. 【Codeforces】Round #491 (Div. 2) 总结

    [Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...

  2. 【Codeforces】Round #488 (Div. 2) 总结

    [Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...

  3. 【转】CSS设置DIV背景色渐变显示

     [原链接]http://www.2cto.com/kf/201310/248187.html <style type="text/css">     .linear{ ...

  4. CSS-布局【1】-图片在div中垂直居中

    方法一:通过增加100%高度行内块居中对齐 <!DOCTYPE html> <html> <head> <meta name="viewport&q ...

  5. 【转】如何让DIV水平和垂直居中

    来源:http://blog.163.com/www.wxs_123/blog/static/82784664201321831746921/ 我们在设计页面的时候,经常要把DIV居中显示,而且是相对 ...

  6. 【转】CSS实现div的高度填满剩余空间

    转自:http://www.cnblogs.com/zhujl/archive/2012/03/20/2408976.html 高度自适应问题,我很抵触用js去解决,因为不好维护,也不够自然,但是纯用 ...

  7. 【转】网页窗口DIV自定义拖动

    一个来自网上的东西- -被我捡到了 然后我访问到了 发出来就可以粘贴复制自己做成js文件了吧 // by zhangxinxu welcome to visit my personal website ...

  8. 【TopCoder】SRM151 DIV2 练习总结

    第一次做完整的SRM题,刷完感觉萌萌哒,不过自己对java中很多细节不熟练,还要边做题边google. 250分的题:判断字符串序列是否是前缀码,如果不是,返回第一个违反前缀码规则的字符串. 简单的暴 ...

  9. 【jQuery01】添加添加div

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. CentOs Linux 分区建议

    硬盘分区方案 在计算机上安装Linux系统,对硬盘进行分区是一个非常重要的步骤,下面介绍几个分区方案. (1)方案1(桌面)/boot:用来存放与Linux系统启动有关的程序,比如启动引导装载程序等, ...

  2. 译文:Javascript-Functions

    个人理解+google翻译+有道翻译.如有错误,请指正.原文来自MDN:Functions Functions是javascript基本构建模块之一.每一个function是一个javascript程 ...

  3. grails的插件

    今天来歪理邪说一下grails的插件. 有个问题让本人困惑了一段时间,插件是属于grails的,还是属于某个工程的?为什么会有这个问题呢,这涉及到grails插件的安装方式. grails的插件像是一 ...

  4. Java http post

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  5. Scrapy简介

    什么是Scrapy? Scrapy是一个快速.高级的爬行器和网页抓取框架,用来抓取网站和提取网页中结构化的数据.它被广泛的使用于监控数据采集和自动化测试. 参考:http://scrapy.org/

  6. WPF如何卸载U盘(弹出USB设备)

    应用程序和硬件设备的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl()与硬件设备通信. CreateFile函数: [DllImport("k ...

  7. C# Winform程序请求管理员权限

    如果你的Winform程序需要管理员权限才能正常执行,请加入如下代码: static class Program { /// <summary> /// 应用程序的主入口点. /// &l ...

  8. Web 高性能开发汇总

    1. Http服务器: 让Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求 大规模网站架构实战之体系结构(一) 大规模网站架构之WEB加速器SQUID(二) ii ...

  9. easy ui 菜单和按钮(Menu and Button)

    http://www.zi-han.net/case/easyui/menu&button.html

  10. EXTJS 资料 combo 点一次触发一次

    { xtype: 'combo', id: 'ApplyToModel', name: 'ApplyToModel', store: comStoreApplyToModel, valueField: ...