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
求长为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
输入
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
备注:
交集为空的情况下,输出"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
输入
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的全排列,按照全排列的顺序输出,每行结尾无空格。
输入
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;
}