比赛链接: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 ;
}

哈理工软件学院"兆方美迪"杯第六届程序设计大赛【高年级组】--决赛 题解的更多相关文章

  1. 2016 "Bird Cup" ICPC7th@ahstu--“波导杯”安徽科技学院第七届程序设计大赛

    "波导杯"安徽科技学院第七届程序设计大赛 Contest - 2016 "Bird Cup" ICPC7th@ahstu Start time:  2016-0 ...

  2. 2016 "Bird Cup" ICPC7th@ahstu--“波导杯”安徽科技学院第七届程序设计大赛

    "波导杯"安徽科技学院第七届程序设计大赛 原文章网页 Contest - 2016 "Bird Cup" ICPC7th@ahstu Start time:   ...

  3. 2014年第五届蓝桥杯C/C++程序设计本科B组决赛

    1.年龄巧合(枚举) 2.出栈次序(推公式/Catalan数) 3.信号匹配(kmp) 4.生物芯片(完全平方数) 5.Log大侠(线段树) 6.殖民地 1.年龄巧合 小明和他的表弟一起去看电影,有人 ...

  4. 2013年第四届蓝桥杯C/C++程序设计本科B组决赛

    1.猜灯谜(枚举) 2.连续奇数和(等差数列) 3.空白格式化(去除空格) 4.高僧斗法(阶梯nim) 5.格子刷油漆(dp) 6.农场阳光 1.猜灯谜 A 村的元宵节灯会上有一迷题:请猜谜 * 请猜 ...

  5. 蓝桥杯第十届真题B组(2019年)

    2019年第十届蓝桥杯大赛软件类省赛C/C++大学B组# 试题 A:组队# 本题总分:5分[问题描述]作为篮球队教练,你需要从以下名单中选出 1号位至 5号位各一名球员,组成球队的首发阵容.每位球员担 ...

  6. 第八届蓝桥杯C/C++程序设计本科B组决赛 ——瓷砖样式(填空题)【DP?我的暴力排列搜索】

    标题:磁砖样式 小明家的一面装饰墙原来是 3*10 的小方格. 现在手头有一批刚好能盖住2个小方格的长方形瓷砖. 瓷砖只有两种颜色:黄色和橙色. 小明想知道,对于这么简陋的原料,可以贴出多少种不同的花 ...

  7. 2016年第七届蓝桥杯C/C++程序设计本科B组决赛

    2.答案300 刁丝卫代码,比赛时long long写成int,结果成了263...一等擦肩而过... #include <iostream> #include <fstream&g ...

  8. 2015年第六届蓝桥杯C/C++程序设计本科B组决赛

    1.积分之谜(枚举) 2.完美正方形 3.关联账户(并查集) 4.密文搜索 5.居民集会 6.模型染色 1.积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C.为了促销,每件商品都会返固定 ...

  9. 2012年第三届蓝桥杯C/C++程序设计本科B组决赛

    1.星期几(取余/excel) 2.数据压缩 3.拼音字母(比较) 4.DNA比对(dp) 5.方块填数 1.星期几[结果填空] (满分5分)    1949年的国庆节(10月1日)是星期六.     ...

随机推荐

  1. yii2.0分页

    本实例是对商品列表进行分页 1.Controller中,商品列表的方法actionList 引用分页类 actionList中: $goods_info=Goods::find()->joinW ...

  2. SQL Server数据库的三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式(转载)

    SQL Server数据库有三种恢复模式:简单恢复模式.完整恢复模式和大容量日志恢复模式: 1.Simple 简单恢复模式, Simple模式的旧称叫”Checkpoint with truncate ...

  3. 关于 屏幕阅读器 和 sr-only

    .sr-only = screen reader only 用于读屏器识别使用.

  4. PHP判断客户端是PC web端还是移动手机端方法

    PHP判断客户端是PC web端还是移动手机端方法需要实现:判断手机版的内容加上!c550x260.jpg后缀变成缩略图PHP用正则批量替换Img中src内容,用正则表达式获取图片路径实现缩略图功能 ...

  5. NSAssert用法

    今天突然发现了一个开发ios程序时调试的好帮手-NSAssert()函数.而且和NSLog()函数一样简单易用,代码如下: NSAssert(x!=0,@"x must not be zer ...

  6. java当中的定时器的几种使用方式

    这几天做的项目有个功能,就是定时执行一项服务,以下几种方法比较高效.不说了  直接撸代码: import java.util.Calendar; import java.util.Date; impo ...

  7. 怎么查看jar包版本

    jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文件里查看 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录 ...

  8. Behavior Designer中的内置消息机制

    最近在用Behavior Designer,其中需要用到消息机制,看了一下其中自带了这套东西 注册 Owner.RegisterEvent<string>("Message&qu ...

  9. Uva 1599 最佳路径

    题目链接:https://uva.onlinejudge.org/external/15/1599.pdf 题意: 保证在最短路的时候,输出字典序最小的路径. 方法: 路径上有了权值,可以利用图论的数 ...

  10. C#中通过Selenium定位<a>标签的问题

    刚才在QQ群里看到有人提问,如何实现退出百度登录问题.那么之所以会有这个问题,主要是因为这个元素,如下图所示,是无法直接定位到的: 经过研究发现,要想定位到这种元素,拢共分两步: 第一步,把鼠标移到能 ...