哈理工软件学院"兆方美迪"杯第六届程序设计大赛【高年级组】--决赛 题解
比赛链接:http://acm-software.hrbust.edu.cn/contest.php?cid=1082
A.好SB啊真是,还以为lis…数有多少个数不一样。
#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int maxn = ;
int ret;
int n;
set<int> s;
int main() {
// freopen("in", "r", stdin);
int T;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
int x;
s.clear();
ret = ;
for(int i = ; i < n; i++) {
scanf("%d", &x);
if(s.find(x) == s.end()) {
ret++;
s.insert(x);
}
}
printf("%d\n", ret);
}
return ;
}
B.顺着求和就行。
#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int maxn = ;
LL ret;
char s[maxn]; int main() {
// freopen("in", "r", stdin);
int T;
scanf("%d", &T);
while(T--) {
scanf("%s", s);
ret = ;
for(int i = ; s[i]; i++) {
ret += s[i] - 'A' + ;
}
cout << ret << endl;
}
return ;
}
C.折半1000-9999,然后对称过来。注意前导零。
#include <bits/stdc++.h>
using namespace std; typedef long long LL; int main() {
// freopen("in", "r", stdin);
for(LL i = ; i <= ; i++) {
printf("%d", i);
int y = ;
int t = i;
int cnt = ;
while(cnt--) {
printf("%d", t % );
t /= ;
}
printf("\n");
}
return ;
}
D.并查集找到所有跟1能接触的人,做01背包。
#include <bits/stdc++.h>
using namespace std; typedef long long LL;
typedef struct P {
int a, b, id;
}P; const int maxn = ;
int n, m, c;
P p[maxn];
int pre[maxn];
int dp[maxn];
int id[maxn]; int find(int x) {
return pre[x] == x ? x : pre[x] = find(pre[x]);
} void unite(int x, int y) {
x = find(x); y = find(y);
if(x != y) pre[x] = y;
} int main() {
// freopen("in", "r", stdin);
int T, u, v;
scanf("%d", &T);
while(T--) {
scanf("%d%d%d",&n,&m,&c);
memset(dp, , sizeof(dp));
for(int i = ; i <= n; i++) pre[i] = i;
for(int i = ; i <= n; i++) {
scanf("%d %d", &p[i].a, &p[i].b);
p[i].id = i;
}
for(int i = ; i < m; i++) {
scanf("%d %d", &u, &v);
unite(u, v);
}
int rt = find();
for(int i = ; i <= n; i++) {
if(rt != find(i)) continue;
for(int j = c; j >= p[i].a; j--) {
dp[j] = max(dp[j], dp[j-p[i].a]+p[i].b);
}
}
printf("%d\n", dp[c]);
}
return ;
}
E.防ak不会…
F.双指针扫,卡住LOVE都出现的最短,然后向后扩展数一共有多少个。
#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int maxn = ;
char s[maxn];
int vis[];
int n;
int ret;
int l, o, v, e; bool ok() {
return l&&o&&v&&e;
} void update(int i) {
if(s[i]=='L')l++;
if(s[i]=='O')o++;
if(s[i]=='V')v++;
if(s[i]=='E')e++;
} int main() {
// freopen("in", "r", stdin);
int T;
scanf("%d", &T);
while(T--) {
memset(s, , sizeof(s));
scanf("%s", s+);
n = strlen(s+);
ret = ;
int lo, hi;
for(lo = ; lo <= n; lo++) {
// memset(vis, 0, sizeof(vis));
l=o=v=e=;
for(hi = lo; hi <= n; hi++) {
// vis[s[hi]]++;
update(hi);
if(ok()) break;
}
if(hi <= n && ok()) ret = ret + n - hi + ;
}
printf("%d\n", ret);
}
return ;
}
G.BFS,实现得有点SB。。。先特判第一步人能走到哪里。然后更新,在循环里先更新火的状态,这个时候在对内同一层的所有的人的状态面对的地图都是一样的。就可以用一个队列来做了。
#include <bits/stdc++.h>
using namespace std; typedef pair<int, int> pii;
typedef struct P {
int x, y, s;
P() {}
P(int x, int y, int s) : x(x), y(y), s(s) {}
}P;
const int inf = 0x7f7f7f;
const int maxn = ;
const int fdx[] = {-,-,-,,,,,};
const int fdy[] = {-,,,-,,-,,};
const int pdx[] = {-,,,};
const int pdy[] = {,,-,};
int n, m, ret;
int sx, sy, ex, ey, fx, fy;
int fcnt, pcnt;
bool vis[maxn][maxn];
char G[maxn][maxn];
queue<P> q; bool ok(int x, int y) {
return x >= && x < n && y >= && y < m;
} bool nigero(int x, int y) {
return x == ex && y == ey;
} void bfs() {
while(!q.empty()) q.pop();
q.push(P(fx, fy, )); vis[fx][fy] = ; fcnt = ;
int tmp = ;
for(int i = ; i < ; i++) {
int xx = sx + pdx[i];
int yy = sy + pdy[i];
if(nigero(xx, yy)) {
ret = ;
return;
}
if(ok(xx, yy) && G[xx][yy] != '*' && G[xx][yy] != '#' && !vis[xx][yy]) {
vis[xx][yy] = ;
q.push(P(xx, yy, )); tmp++;
}
}
pcnt = tmp; tmp = ;
while(!q.empty()) {
for(int k = ; k < fcnt; k++) {
P f = q.front(); q.pop();
for(int i = ; i < ; i++) {
int xx = f.x + fdx[i];
int yy = f.y + fdy[i];
if(ok(xx, yy) && G[xx][yy] != '*') {
G[xx][yy] = '*';
q.push(P(xx, yy, f.s+)); tmp++;
}
}
}
fcnt = tmp; tmp = ;
for(int k = ; k < pcnt; k++) {
P p = q.front(); q.pop();
if(nigero(p.x, p.y)) {
ret = p.s;
return;
}
if(G[p.x][p.y] == '*') continue;
for(int i = ; i < ; i++) {
int xx = p.x + pdx[i];
int yy = p.y + pdy[i];
if(ok(xx, yy) && G[xx][yy] != '*' && G[xx][yy] != '#' && !vis[xx][yy]) {
vis[xx][yy] = ;
q.push(P(xx, yy, p.s+)); tmp++;
}
}
}
pcnt = tmp; tmp = ;
}
} int main() {
// freopen("in", "r", stdin);
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d",&n,&m);
ret = inf;
for(int i = ; i < n; i++) scanf("%s", G[i]);
memset(vis, , sizeof(vis));
for(int i = ; i < n; i++) {
for(int j = ; j < m; j++) {
if(G[i][j] == 'S') {
sx = i; sy = j;
} else if(G[i][j] == 'E') {
ex = i; ey = j;
} else if(G[i][j] == '*') {
fx = i; fy = j;
}
}
}
bfs();
if(ret == inf) puts("T_T");
else printf("%d\n", ret);
}
return ;
}
H.递推发现是个斐波那契,矩阵加速一下就行了。
#include <bits/stdc++.h>
using namespace std; typedef long long LL;
const LL mod = ;
const int maxn = ;
LL n; typedef struct Matrix {
LL m[maxn][maxn];
int r;
int c;
Matrix(){
r = c = ;
memset(m, , sizeof(m));
}
} Matrix; Matrix mul(Matrix m1, Matrix m2) {
Matrix ans = Matrix();
ans.r = m1.r;
ans.c = m2.c;
for(int i = ; i <= m1.r; i++) {
for(int j = ; j <= m2.r; j++) {
for(int k = ; k <= m2.c; k++) {
if(m2.m[j][k] == ) continue;
ans.m[i][k] = ((ans.m[i][k] + m1.m[i][j] * m2.m[j][k] % mod) % mod) % mod;
}
}
}
return ans;
} Matrix quickmul(Matrix m, LL n) {
Matrix ans = Matrix();
for(int i = ; i <= m.r; i++) {
ans.m[i][i] = ;
}
ans.r = m.r;
ans.c = m.c;
while(n) {
if(n & ) {
ans = mul(m, ans);
}
m = mul(m, m);
n >>= ;
}
return ans;
} int main() {
// freopen("in", "r", stdin);
int T;
scanf("%d", &T);
while(T--) {
scanf("%lld", &n);
Matrix p, q;
p.r = p.c = ;
p.m[][] = ; p.m[][] = ;
p.m[][] = ; p.m[][] = ;
q.r = ; q.c = ;
if(n <= ) {
printf("%lld\n", n);
continue;
}
q = quickmul(p, n-);
printf("%lld\n", (q.m[][] + q.m[][]) % mod);
}
return ;
}
I.求n次最短路,每次求最短路的时候是以那个点为枢纽。给所有的最短路排序,然后从大到小找两个点,把两条最长的最短路加起来更新答案。
#include <bits/stdc++.h>
using namespace std; typedef pair<int, int> pii;
const int inf = 0x7f7f7f7;
const int maxn = ;
vector<pii> G[maxn];
bool vis[maxn];
queue<int> q;
int d[maxn];
int n, m, ret; void spfa(int s) {
for(int i = ; i <= n; i++) d[i] = inf;
memset(vis, , sizeof(vis));
while(!q.empty()) q.pop();
d[s] = ; q.push(s);
while(!q.empty()) {
int u = q.front(); q.pop();
vis[u] = ;
for(int i = ; i < G[u].size(); i++) {
int& v = G[u][i].first;
int& w = G[u][i].second;
if(d[v] > d[u] + w) {
d[v] = d[u] + w;
if(vis[v]) continue;
vis[v] = ; q.push(v);
}
}
}
sort(d+, d+n+);
int cnt = , x = ;
for(int i = n; i >= ; i--) {
if(cnt >= ) break;
if(d[i] == ) continue;
if(d[i] != inf) {
x += d[i];
cnt++;
}
}
if(cnt == ) ret = max(ret, x);
} int main() {
// freopen("in", "r", stdin);
int u, v, w, T;
scanf("%d", &T);
while(T--) {
ret = -;
scanf("%d%d",&n,&m);
for(int i = ; i <= n; i++) G[i].clear();
for(int i = ; i < m; i++) {
scanf("%d%d%d", &u,&v,&w);
G[u].push_back(pii(v, w));
G[v].push_back(pii(u, w));
}
for(int i = ; i <= n; i++) spfa(i);
printf("%d\n", ret);
}
return ;
}
哈理工软件学院"兆方美迪"杯第六届程序设计大赛【高年级组】--决赛 题解的更多相关文章
- 2016 "Bird Cup" ICPC7th@ahstu--“波导杯”安徽科技学院第七届程序设计大赛
"波导杯"安徽科技学院第七届程序设计大赛 Contest - 2016 "Bird Cup" ICPC7th@ahstu Start time: 2016-0 ...
- 2016 "Bird Cup" ICPC7th@ahstu--“波导杯”安徽科技学院第七届程序设计大赛
"波导杯"安徽科技学院第七届程序设计大赛 原文章网页 Contest - 2016 "Bird Cup" ICPC7th@ahstu Start time: ...
- 2014年第五届蓝桥杯C/C++程序设计本科B组决赛
1.年龄巧合(枚举) 2.出栈次序(推公式/Catalan数) 3.信号匹配(kmp) 4.生物芯片(完全平方数) 5.Log大侠(线段树) 6.殖民地 1.年龄巧合 小明和他的表弟一起去看电影,有人 ...
- 2013年第四届蓝桥杯C/C++程序设计本科B组决赛
1.猜灯谜(枚举) 2.连续奇数和(等差数列) 3.空白格式化(去除空格) 4.高僧斗法(阶梯nim) 5.格子刷油漆(dp) 6.农场阳光 1.猜灯谜 A 村的元宵节灯会上有一迷题:请猜谜 * 请猜 ...
- 蓝桥杯第十届真题B组(2019年)
2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组# 试题 A:组队# 本题总分:5分[问题描述]作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员,组成球队的首发阵容.每位球员担 ...
- 第八届蓝桥杯C/C++程序设计本科B组决赛 ——瓷砖样式(填空题)【DP?我的暴力排列搜索】
标题:磁砖样式 小明家的一面装饰墙原来是 3*10 的小方格. 现在手头有一批刚好能盖住2个小方格的长方形瓷砖. 瓷砖只有两种颜色:黄色和橙色. 小明想知道,对于这么简陋的原料,可以贴出多少种不同的花 ...
- 2016年第七届蓝桥杯C/C++程序设计本科B组决赛
2.答案300 刁丝卫代码,比赛时long long写成int,结果成了263...一等擦肩而过... #include <iostream> #include <fstream&g ...
- 2015年第六届蓝桥杯C/C++程序设计本科B组决赛
1.积分之谜(枚举) 2.完美正方形 3.关联账户(并查集) 4.密文搜索 5.居民集会 6.模型染色 1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C.为了促销,每件商品都会返固定 ...
- 2012年第三届蓝桥杯C/C++程序设计本科B组决赛
1.星期几(取余/excel) 2.数据压缩 3.拼音字母(比较) 4.DNA比对(dp) 5.方块填数 1.星期几[结果填空] (满分5分) 1949年的国庆节(10月1日)是星期六. ...
随机推荐
- Openstack的vnc界面定制
先来看一下青云的vnc界面: 在来看一下openstack的自带的vnc界面: 区别于感受 本身原理是一样的,但是vnc上面的html布局不一样而已,但是青云的vnc界面给人的感受是:清晰提示,信息给 ...
- AndroidUI自动化测试工具-UIautomator
转自:http://www.cnblogs.com/rexmzk/archive/2012/12/26/2834380.html 最近公司在开展Android的自动化测试,美国那边的开发人员利用And ...
- iOS 学习笔记 二 (2015.02.26)
How To Use Git Source Control with Xcode in iOS 6 If you're new here, you may want to subscribe to m ...
- hadoop概述测试题和基础模版代码
hadoop概述测试题和基础模版代码 1.Hadoop的创始人是DougCutting?() A.正确 B.错误答对了!正确答案:A解析:参考课程里的文档,这个就不解释了2.下列有关Hadoop的说法 ...
- keepalived+mysql主主
实验架构图: 一.mysql 5.5双机热备份 master-master 1.系统环境 操作系统:centos6.6 masterA IP:192.168.166.161 masterB ip:19 ...
- Linux下命令行安装WebLogic 10.3.6
1.创建用户useradd weblogic;创建用户成功linux系统会自动创建一个和用户名相同的分组,并将该用户分到改组中.并会在/home路径下创建一个和用户名相同的路径,比如我们创建的webl ...
- HDU 5996:dingyeye loves stone(阶梯博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=5996 题意:在一棵树上进行博弈,每次只能将当前的结点的石子放到父节点上,最后不能移动的输. 思路:比赛的时候想的 ...
- Oracle中左右外连接详解
数据表的连接有: 1.内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2.外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两 ...
- Java学习之路(二)
什么是变量? 1:计算机是一种嫉妒精确的机器 2:要将信息存储在计算机当中,就必须指明信息存储的位置和所需的内存空间: 3:在Java当中 使用声明语句来完成上述任务 变量的类型:
- Linq中疏漏的几个知识点
1.Union - 连接不同集合,自动过滤相同项 2.Concat - 连接不同集合,不会自动过滤相同项 3.Select - 类似List的ConvertAll,转换集合成员 4.Enumerabl ...