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