比赛链接: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. Calibrating delay loop... 问题以及解决方法(RealARM开发板)

    RealARM的210开发板在启动是有时会出现这样的死循环 Calibrating delay loop... ,那么原因是什么呢? 经过查找,发现跟RTC有关,实际上就是晶振和RTC电源的问题.所以 ...

  2. 鸟哥的linux私房菜之磁盘与文件系统管理

    superblock:记录了该文件系统的整体信息包括inode/block的总量,使用量,剩余量以及文件系统的格式与相关信息. inode:记录档案的属性,一个档案占用一个inode,同事记录此档案所 ...

  3. JSP/Servlet 中的汉字编码问题

    JSP/Servlet 中的汉字编码问题 1.问题的起源 每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的 ASCII,中国的 GB2312 -80,日本的 JIS 等,作为该国家/区 ...

  4. Apache服务器访问过慢分析及解决

    起因:线上的一台服务器,最近总是出现 访问 很慢的情况发生,点击一个链接要2秒钟以上才能打开,按照我们对于访问人数的估计,服务器应该不至于响应这么慢,从而需要针对这个问题进行分析,来解决网站访问过慢. ...

  5. lz: linux ls 变种 只显示大小和名称(包括目录)

    本次输入法使用: 手心输入法 for Mac 1.0版 测试环境为:Ubuntu 14.14.2 LTS updates 测试时间为:2015年5月28日,感觉死亡将至的夜晚,独自一人坐在一个角落,戴 ...

  6. zabbix监控mysql主从

    最近在公司搭建了zabbix监控系统,现在需要用zabbix来监控mysql的主从同步情况 现在说一下配置的详细步骤: 1.首先给mysql分配一个监控的账号: mysql> grant rep ...

  7. oracle 自定义 聚合函数

    Oracle自定义聚合函数实现字符串连接的聚合   create or replace type string_sum_obj as object ( --聚合函数的实质就是一个对象      sum ...

  8. vm克隆虚拟机网络配置

    *CentOS虚拟机网络连接方式为:桥接模式* 虚拟机克隆后会导致网络连接不上:(引起原因是新的MAC和网卡配置对应不上)问题解决(在克隆机里执行下列步骤): vi /etc/udev/rules.d ...

  9. 【转载】Perl异常处理方法总结

    程序脚本在运行过程中,总会碰到这样那样的问题,我们会预知一些问题并为其准备好处理代码,而有一些不能预知.好的程序要能尽可能多的处理可能出现的异常问题,本文就总结了一些方法来解决这些异常,当然perl在 ...

  10. 错误代码:ERR_UNSAFE_PORT

    修改下应用的端口为7788就好了:http://localhost:7788/taiping-sol-insu-vehicle/vehicleEntrance.action. 这个主要是chrome的 ...