2018年全国多校算法寒假训练营练习比赛(第四场)ABCFH

A 石油采集

链接:https://www.nowcoder.com/acm/contest/76/A
来源:牛客网

题目描述

随着海上运输石油泄漏的问题,一个新的有利可图的行业正在诞生,那就是撇油行业。如今,在墨西哥湾漂浮的大量石油,吸引了许多商人的目光。这些商人们有一种特殊的飞机,可以一瓢略过整个海面20米乘10米这么大的长方形。(上下相邻或者左右相邻的格子,不能斜着来)当然,这要求一瓢撇过去的全部是油,如果一瓢里面有油有水的话,那就毫无意义了,资源完全无法利用。现在,商人想要知道,在这片区域中,他可以最多得到多少瓢油。

地图是一个N×N的网络,每个格子表示10m×10m的正方形区域,每个区域都被标示上了是油还是水

输入描述:

测试输入包含多条测试数据测试数据的第一行给出了测试数据的数目T(T<75)每个测试样例都用数字N(N<50)来表示地图区域的大小,接下来N行,每行都有N个字符,其中符号’.’表示海面、符号’#’表示油面。

输出描述:

输出格式如下“Case X: M”(X从1开始),M是商人可以最多得到的油量。
输入例子:
1
6
......
.##...
......
.#..#.
.#..##
......
输出例子:
Case 1: 3

-->

示例1

输入

1
6
......
.##...
......
.#..#.
.#..##
......

输出

Case 1: 3

求长为2宽为1的#有多少个,由于两个相连,那么坐标(x,y)相加一定是一个奇数一个偶数,每个#块统计奇数后偶数的数量,最小的那个一定是这个区域块中最大的。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 55;
char str[N][N];
int t, n, ans1, ans2;
void dfs(int x, int y) {
	if(1 > x || x > n || 1 > y || y > n || str[x][y] == ‘.‘) return;
	((x+y)&1)?ans1++:ans2++;
	str[x][y] = ‘.‘;
	dfs(x+1,y);
	dfs(x-1,y);
	dfs(x,y-1);
	dfs(x,y+1);
}
int main() {
	cin >> t;
	for(int ca = 1; ca <= t; ca ++) {
		cin >> n;
		for(int i = 1; i <= n; i ++) cin >> str[i]+1;
		int ans = 0;
		for(int i = 1; i <= n; i ++) {
			for(int j = 1; j <= n; j ++) {
				if(str[i][j] == ‘#‘) {
					ans1 = ans2 = 0;
					dfs(i,j);
					ans += min(ans1, ans2);
				}
			}
		}
		printf("Case %d: %d\n",ca,ans);
	}
	return 0;
}

B 道路建设

链接:https://www.nowcoder.com/acm/contest/76/b
来源:牛客网

题目描述

随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交易。虽然市长的想法很好,但是他也遇到了一般人也经常头疼的问题,那就是手头的经费有限……在规划过程中,设计师们已经预算出部分城市之间建设公路的经费需求。现在市长想知道,它能不能将他的m个城市在有限的经费内实现公路交通。如果可以的话,输出Yes,否则输出No(两个城市不一定要直接的公路相连,间接公路到达也可以。)

输入描述:

测试输入包含多条测试数据每个测试数据的第1行分别给出可用的经费c(<1000000),道路数目n(n<10000),以及城市数目m(<100)。接下来的n行给出建立公路的成本信息,每行给出三个整数,分别是相连的两个城市v1、v2(0<v1,v2<=m)以及建设公路所需的成本h(h<100)。

输出描述:

对每个测试用例,输出Yes或No。
输入例子:
20 10 5
1 2 6
1 3 3
1 4 4
1 5 5
2 3 7
2 4 7
2 5 8
3 4 6
3 5 9
4 5 2
输出例子:
Yes

-->

示例1

输入

20 10 5
1 2 6
1 3 3
1 4 4
1 5 5
2 3 7
2 4 7
2 5 8
3 4 6
3 5 9
4 5 2

输出

Yes

示例2

输入

10 2 2
1 2 5
1 2 15

输出

Yes

备注:

两个城市之间可能存在多条线路

最小生成树的模板题
#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int c, n, m;
struct Nod {
	int u, v, w;
}nod[N];
int fa[110], ans;
bool cmp(Nod a, Nod b) {
	return a.w < b.w;
}
void init() {
	for(int i = 0; i < 110; i ++) fa[i] = i;
	ans = 0;
}
int find(int x) {
	return fa[x] == x ? x: find(fa[x]);
}
void uni(int x, int y) {
	x = find(x), y = find(y);
	if(x > y) fa[x] = y;
	else fa[y] = x;
}
int main() {
	while(scanf("%d%d%d",&c,&n,&m) != EOF) {
		init();
		for(int i = 0; i < n; i ++) {
			cin >> nod[i].u >> nod[i].v >> nod[i].w;
		}
		sort(nod,nod+n,cmp);
		for(int i = 0; i < n; i ++) {
			if(find(nod[i].u) != find(nod[i].v)) {
				ans += nod[i].w;
				uni(nod[i].u,nod[i].v);
			}
		}
		if(ans > c) printf("No\n");
		else printf("Yes\n");
	}
}

C 求交集

链接:https://www.nowcoder.com/acm/contest/76/c
来源:牛客网

题目描述

给你两个升序排列的集合,求出两个集合的交集。

输入描述:

有多个测试用例,输入到文件结束。对于每一个测试用例:第一行输入两个整数n,m(0<n,m<=1000000),分别代表第一个集合和第二个集合的元素的数量。第二行输入n个整数,表示第一个集合中的元素,元素之间用空格隔开。第三行输入m个整数,表示第二个集合中的元素,元素之间用空格隔开。两个集合中的元素范围在[-1000000000,1000000000]区间内。

输出描述:

每个测试用例用一行来输出两个集合的交集的所有元素(元素用空格隔开且按升序排列),若交集为空则输出"empty"。
输入例子:
2 3
1 3
1 2 3
输出例子:
1 3

-->

示例1

输入

2 3
1 3
1 2 3

输出

1 3

备注:

交集为空的情况下,输出"empty"。

一开始用set,发现内存超了,就用了数组储存,又由于是排序好了的,就不需要排序,直接二分查找了。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n, m, x;
const int N = 1000010;
int vis[N];
vector<int> vs;
bool bin(int x) {
	int l = 1, r = n;
	while(l <= r) {
		int m = (l+r) >> 1;
		if(vis[m] == x) return true;
		else if(vis[m] > x) r = m-1;
		else l = m+1;
	}
	return false;
}
int main() {
	while(cin >> n >> m) {
		vs.clear();
		for(int i = 1; i <= n; i ++) {
			scanf("%d", &vis[i]);
		}
		for(int i = 1; i <= m; i ++) {
			scanf("%d", &x);
			if(bin(x)) vs.push_back(x);
		}
		if(vs.empty()) printf("empty\n");
		else {
			for(int i = 0, len = vs.size(); i < len; i ++) {
				printf("%d%c",vs[i],(i==len-1)?‘\n‘:‘ ‘);
			}
		}
	}
	return 0;
}

F Call to your teacher

链接:https://www.nowcoder.com/acm/contest/76/f
来源:牛客网

题目描述

从实验室出来后,你忽然发现你居然把自己的电脑落在了实验室里,但是实验室的老师已经把大门锁上了。更糟的是,你没有那个老师的电话号码。你开始给你知道的所有人打电话,询问他们有没有老师的电话,如果没有,他们也会问自己的同学来询问电话号码。那么,你能联系到老师并且拿到电脑吗。

输入描述:

存在多组测试样例每组样例的第一行分别是两个整数n(1<n<=50),m(1<m<=2000),n是在题目当中出现的人数,其中你的序号是1号,实验室老师的序号是n。接下来的m行,每行有两个整数x(1<=x<=n),y(1<=y<=n),代表x有y的电话号码。

输出描述:

对于每组测试样例,如果你最终能联系到老师,输出“Yes”,否则输出“No”。
输入例子:
5 5
1 3
2 3
3 4
2 4
4 5
输出例子:
Yes

-->

示例1

输入

5 5
1 3
2 3
3 4
2 4
4 5

输出

Yes

示例2

输入

4 3
1 2
2 3
4 1

输出

No

简单的dfs问题
#include <bits/stdc++.h>
#define ll long long
using namespace std;
vector<int> vs[55];
bool vis[55], flag;
int n, m;
void init() {
	for(int i = 0; i < 55; i ++) {
		vs[i].clear();
		vis[i] = 0;
	}
	flag = false;
}
void dfs(int x) {
	for(int i = 0; i < vs[x].size(); i ++) {
		int y = vs[x][i];
		if(y == n) {
			flag = true;
			return;
		}
		if(!vis[y]) {
			vis[y] = true;
			dfs(y);
		}
	}
}
int main() {
	while(cin >> n >> m) {
		init();
		for(int i = 1; i <= m; i ++) {
			int x, y;
			cin >> x >> y;
			vs[x].push_back(y);
		}
		dfs(1);
		if(flag) printf("Yes\n");
		else printf("No\n");
	}
	return 0;
}

H 老子的全排列呢

链接:https://www.nowcoder.com/acm/contest/76/h
来源:牛客网

题目描述

老李见和尚赢了自己的酒,但是自己还舍不得,所以就耍起了赖皮,对和尚说,光武不行,再来点文的,你给我说出来1-8的全排序,我就让你喝,这次绝不耍你,你能帮帮和尚么?

输入描述:

输出描述:

1~8的全排列,按照全排列的顺序输出,每行结尾无空格。
输入例子:
No_Input
输出例子:
Full arrangement of 1~8

-->

示例1

输入

No_Input

输出

Full arrangement of 1~8

备注:

1~3的全排列  :1 2 31 3 22 1 32 3 13 1 23 2 1

签到题。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[] = {1,2,3,4,5,6,7,8};
int main() {
	do{
		for(int i = 0; i < 8; i ++) {
			printf("%d%c",a[i],(i==7)?‘\n‘:‘ ‘);
		}
	}while(next_permutation(a,a+8));
	return 0;
}

原文地址:https://www.cnblogs.com/xingkongyihao/p/8444064.html

时间: 2024-10-31 04:38:17

2018年全国多校算法寒假训练营练习比赛(第四场)ABCFH的相关文章

【2018年全国多校算法寒假训练营练习比赛(第四场)-A】石油采集(匈牙利算法)

试题链接:https://www.nowcoder.com/acm/contest/76/A [思路] 每个‘#’的右边和下边如果也是‘#’说明这两个点构成通路,以此重构一幅图,然后找二分图的最大匹配. [代码] #include<bits/stdc++.h> using namespace std; char mp[55][55]; bool vis[2505]; vector<int>G[2505]; int mp1[55][55], match[2505], n; bool

【2018年全国多校算法寒假训练营练习比赛(第四场)-D】小明的挖矿之旅

题目链接:https://www.nowcoder.com/acm/contest/76/D 做题时没注意到“无论出现在哪个格子”..题中也没说明一个格子只能经过一次,其实没有想象的复杂. 判断如果点的下边或右边不能走,传送门数+1.特判只有一个‘.’传送门数为0 代码: #include<bits/stdc++.h> using namespace std; char mp[1004][1004]; int main() { int n, m, i, j; while(~scanf(&quo

【题集】牛客网&#183;2018年全国多校算法寒假训练营练习比赛(第二场)

原文链接:2018年全国多校算法寒假训练营练习比赛(第二场) A 吐泡泡 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 小鱼儿吐泡泡,嘟嘟嘟冒出来.小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o". 两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉. (是的你没看错,小气泡和大气泡不会产生任何变化的,原因我也不知道.) 例如:ooOOoooO经过一段时间

2018年全国多校算法寒假训练营练习比赛(第一场)G.圆圈

链接:https://www.nowcoder.com/acm/contest/67/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 圈圈圆圆圈圈,lulu小朋友最近看喜羊羊看多了,老是受刺激就画圆圈,听到小于8的数字时,还会画出十分有规律的圆圈,现在你需要根据样例观察出规律,编写程序,根据输入的数字n(n<8),输出对应的圆圈. 输入描述: 第一行是样例数T(T<9)第2

2018年全国多校算法寒假训练营练习比赛(第一场)D N阶汉诺塔变形

https://www.nowcoder.com/acm/contest/67/D 思路: 先手动模拟一下过程,以下是模拟过程,按顺序表示第几步需要移动的盘标号 1 1 2 1 1 2 1 1 3 1 1 2 1 1 2 1 1 3 1 1 2 1 1 2 1 1 4 1 1 2 ...... 我们发现每出现两次1就会出现一次2,每两次2就会出现一次3,每两次3就会出现一次4,每两次4就会出现一次5...... 然后我们发现如果把所有大于1的标号看成1,那么k步1出现的次数是 k/1 如果把所有

2018年全国多校算法寒假训练营练习比赛(第二场)

A题: 链接:https://www.nowcoder.com/acm/contest/74/A来源:牛客网 小鱼儿吐泡泡,嘟嘟嘟冒出来.小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o". 两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉. (是的你没看错,小气泡和大气泡不会产生任何变化的,原因我也不知道.) 例如:ooOOoooO经过一段时间以后会变成oO. 输入描述: 数据有多组,处理到文件结束.每组输入包含一行仅有'O'与'o'组成的字符串. 输出描述

2018年全国多校算法寒假训练营练习比赛(第二场)F - 德玛西亚万岁

链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网 题目描述 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意识形态,这里的人民为此感到强烈自豪. 有一天他们想去制裁邪恶的比尔吉沃特,于是派遣了自己最优秀的战士. 结果比尔吉沃特领土太小,只有长为n宽为m共计n*m块土地,其中有些土 地标记为0表示为高山峻岭或者深海湖泊,英雄们无法在其中站立,只有标 记为1的土地才能容纳一个英雄.德玛西亚的英雄们战

2018年全国多校算法寒假训练营练习比赛(第二场)A.吐泡泡

原题链接 描述 小鱼儿吐泡泡,嘟嘟嘟冒出来.小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o". 两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉. (是的你没看错,小气泡和大气泡不会产生任何变化的,原因我也不知道.) 注意:自左到右进行合并. 例如:ooOOoooO经过一段时间以后会变成oO. 输入 数据有多组,处理到文件结束. 每组输入包含一行仅有'O'与'o'组成的字符串. 输出 每组输出仅包含一行,输出一行字符串代表小鱼儿吐出的泡泡经过融合以后所剩余的

【2018年全国多校算法寒假训练营练习比赛(第五场)-E】情人节的电灯泡(二维树状数组单点更新+区间查询)

试题链接:https://www.nowcoder.com/acm/contest/77/E 题目描述 情人节到了,小芳和小明手牵手,打算过一个完美的情人节,但是小刚偏偏也来了,当了一个明晃晃的电灯泡,小明很尴尬,就和小刚说,我交给你个任务,你完成了我俩就带你玩,否则你就回家吧.小刚很有当单身狗的觉悟,他坚决不想让小明过好情人节,同为单身狗的你能帮帮他吗?现在有一个n×n(1 <= n <= 1000)的格子,每一个格子都有一个电灯泡,可能是亮的,也可能是灭的(1代表亮, 0代表灭),现在有两

【2018年全国多校算法寒假训练营练习比赛(第三场)】

之前题目比较水,今天的还可以. [A 不凡的大夫] 方法一:答案是log8(n!),解决方案是预处理,将需要的答案记录下来以免超内存: 方法二:用公式,斯特林公式:    [B 一个小问题] 题解:线性同余方程组,一看就不是中国剩余定理,当心. [C 守护白起] 题解:polya..... [D 小牛vs小客] 题解:博弈,做过不久. [E 进击吧!阶乘] 题解:高精度裸题. [F 小牛再战] 题解:博弈,看看第一步能不能控制住对方. [G 大水题] 题解:简单容斥定理. [H 向左走] 一眼不