码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-02-12 13:35:00      阅读:275      评论:0      收藏:0      [点我收藏+]

标签:define   +=   gpo   意义   teacher   规划   比赛   否则   tle   

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

输入

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。
示例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"。
示例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”。
示例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的全排列,按照全排列的顺序输出,每行结尾无空格。
示例1

输入

No_Input

输出

Full arrangement of 1~8

备注:

1~3的全排列  :
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 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;
}

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

标签:define   +=   gpo   意义   teacher   规划   比赛   否则   tle   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!