A-石油采集

题目描述
随着海上运输石油泄漏的问题,一个新的有利可图的行业正在诞生,那就是撇油行业。如今,在墨西哥湾漂浮的大量石油,吸引了许多商人的目光。这些商人们有一种特殊的飞机,可以一瓢略过整个海面20米乘10米这么大的长方形。(上下相邻或者左右相邻的格子,不能斜着来)当然,这要求一瓢撇过去的全部是油,如果一瓢里面有油有水的话,那就毫无意义了,资源完全无法利用。现在,商人想要知道,在这片区域中,他可以最多得到多少瓢油。
地图是一个N×N的网络,每个格子表示10m×10m的正方形区域,每个区域都被标示上了是油还是水
链接:https://www.nowcoder.net/acm/contest/76/A
题解
遍历所有点,判断当前点能不能和周围某个点相消。例如

样例一
###
#..
###
样例二
###
#..
#..
#..

判断某点能否相消,就要看与其周围直线连接的点是否是#。
可以证明的是,永远是从最开头消点,例如样例二。最好的方案是(0,0)(1,0)、(0,1)(0,2)、(2,0)(3,0)。当我们判断(0,0)能否与其周围点相消时,先要dfs走到这个方向的开头,反过来消。

代码

#include <bits/stdc++.h>
using namespace std;
int n,ans;
char mp[55][55];
const int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool dfs(int x,int y)
{for(int i=0;i<4;i++){int dx=x+dir[i][0];int dy=y+dir[i][1];if(dx<n&&dx>=0&&dy<n&&dy>=0&&mp[dx][dy]=='#'){mp[x][y]='.';if(!dfs(dx,dy)){mp[dx][dy]='.';ans++;return true;}mp[x][y]='#';}}return false;
}
int main()
{int T;while(~scanf("%d",&T)){for(int cas=1;cas<=T;cas++){ans=0;scanf("%d",&n);for(int i=0;i<n;i++) scanf("%s",mp[i]);for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(mp[i][j]=='#'){dfs(i,j);}}}printf("Case %d: %d\n",cas,ans);}}
}

B-道路建设

题目描述
随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交易。虽然市长的想法很好,但是他也遇到了一般人也经常头疼的问题,那就是手头的经费有限……在规划过程中,设计师们已经预算出部分城市之间建设公路的经费需求。现在市长想知道,它能不能将他的m个城市在有限的经费内实现公路交通。如果可以的话,输出Yes,否则输出No(两个城市不一定要直接的公路相连,间接公路到达也可以。)
链接:https://www.nowcoder.net/acm/contest/76/B
备注:两个城市之间可能存在多条线路
题解
最小生成树。这里我用的Kruskal算法。
代码

#include <bits/stdc++.h>
using namespace std;
struct node
{int v1,v2;int h;bool operator<(const node&other)const{return h<other.h;}
}nod[10005];
int main()
{int c,n,m;while(~scanf("%d%d%d",&c,&n,&m)){int ans=0;for(int i=0;i<n;i++){//输入两点及两点路径。scanf("%d%d%d",&nod[i].v1,&nod[i].v2,&nod[i].h);}sort(nod,nod+n);//给两点间的路径排序。优先选择最小。bool vis[105]={0};vis[nod[0].v1]=1;//默认先选择nod[0].x为起始点。int NN=1;//已连通的点数for(int i=0;i<n;i++){int num=vis[nod[i].v1]+vis[nod[i].v2];if(NN==m) break;//若所有点都连通则退出。if(num==1){ans+=nod[i].h;NN++;vis[nod[i].v1]=vis[nod[i].v2]=1;i=0;//重新遍历未连通的最小路径的点。}}printf("%s\n",ans<=c?"Yes":"No");}return 0;
}

C-求交集

题目描述
给你两个升序排列的集合,求出两个集合的交集。
链接:https://www.nowcoder.net/acm/contest/76/C
题解
先把集合A用数组V存起来。再用二分搜索确定集合B中的某个数是否在集合A中,若在即输出。
代码

#include <bits/stdc++.h>
using namespace std;
vector<int>v;
const int inf=1000000001;
int main()
{int n,m;while(~scanf("%d%d",&n,&m)){for(int i=0;i<n;i++){int t;scanf("%d",&t);v.push_back(t);}int tem=inf;for(int i=0;i<m;i++){int t;scanf("%d",&t);if(binary_search(v.begin(),v.end(),t)==true){if(tem!=inf) printf("%d ",tem);tem=t;}}if(tem!=inf) printf("%d\n",tem);else printf("empty\n");}return 0;
}

E-通知小弟

题目描述
在战争时期,A国派出了许多间谍到其他国家去收集情报。因为间谍需要隐秘自己的身份,所以他们之间只是单向联系。所以,某个间谍只能单向联系到一部分的间谍。同时,间谍也不知道跟他联系的是谁。
HA是间谍们的老大,但他也只能联系到部分的间谍。HA现在有一项命令有告诉所有的间谍。HA想要知道他至少要告诉多少个他能联系上的间谍才能通知到所有的间谍。
链接:https://www.nowcoder.net/acm/contest/76/E
题解
题目意思是求你最少需要联系几个你能联系的小弟。那么就容易出现考虑不到位的情况。比如HA能联系间谍A和B,B也能联系A,这种情况只要联系B即可。具体看我另外给出的测试样例。
样例一

3 3
1 2 3
0
2 1 3
0

样例二

4 2
1 2
0
1 3
1 4
1 2

代码

#include <bits/stdc++.h>
using namespace std;
vector<int>x;
vector<int>a[505];
bool vis[505],cst[505];
int ans=0;
void dfs(int k,int s)
{vis[k]=1;for(int i=0;i<a[k].size();i++){int v=a[k][i];if(!vis[v]) dfs(v,s);else if(v!=s &&cst[v]){cst[v]=false;ans--;}}
}
int main()
{int n,m;while(~scanf("%d%d",&n,&m)){memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++) a[i].clear();x.clear();ans=0;for(int i=1;i<=m;i++){int xx;scanf("%d",&xx);x.push_back(xx);}for(int i=1;i<=n;i++){int nn;scanf("%d",&nn);for(int j=1;j<=nn;j++){int aa;scanf("%d",&aa);a[i].push_back(aa);}}for(int i=0;i<m;i++){if(!vis[x[i]]){ans++;cst[x[i]]=true;dfs(x[i],x[i]);}}int flag=1;for(int i=1;i<=n;i++){if(!vis[i]){flag=0;break;}}printf("%d\n",flag?ans:-1);}return 0;
}

F-Call to your teacher

题目描述
从实验室出来后,你忽然发现你居然把自己的电脑落在了实验室里,但是实验室的老师已经把大门锁上了。更糟的是,你没有那个老师的电话号码。你开始给你知道的所有人打电话,询问他们有没有老师的电话,如果没有,他们也会问自己的同学来询问电话号码。那么,你能联系到老师并且拿到电脑吗。
链接:https://www.nowcoder.net/acm/contest/76/F
题解
dfs搜索即可。注意设置vis[]数组,免去多余的操作。否则在OJ上提示内存超限。
代码

#include <bits/stdc++.h>
using namespace std;
vector<vector<int> > son;
int n,m;
int flag=0;
bool vis[55];
void dfs(int k)
{vis[k]=1;if(k==n){flag=1;return;}for(int i=0;i<son[k].size();i++){if(flag==1) return;if(vis[son[k][i]]==0) dfs(son[k][i]);}
}
int main()
{while(~scanf("%d%d",&n,&m)){flag=0;while(!son.empty()) son.clear();memset(vis,0,sizeof(vis));son.resize(n+1);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);son[x].push_back(y);}dfs(1);printf("%s\n",(flag==1?"Yes":"No"));}
}

H-老子的全排列呢

题目描述
老李见和尚赢了自己的酒,但是自己还舍不得,所以就耍起了赖皮,对和尚说,光武不行,再来点文的,你给我说出来1-8的全排序,我就让你喝,这次绝不耍你,你能帮帮和尚么?
链接:https://www.nowcoder.net/acm/contest/76/H
题解
主要用到了一个函数next_permutation。next_permutation函数详析<<
或者用全排列的方法。子集生成样题<<
代码

#include <bits/stdc++.h>
using namespace std;
int main()
{int a[10]={1,2,3,4,5,6,7,8};do{for(int i=0;i<8;i++){cout<<a[i];if(i==7) cout<<endl;else cout<<" ";}}while(next_permutation(a,a+8));return 0;
}

牛客网 2018年全国多校算法寒假训练营练习比赛(第四场) 题解相关推荐

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

    原文链接:2018年全国多校算法寒假训练营练习比赛(第二场) A 吐泡泡 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Form ...

  2. 【题集·待解决】牛客网·2018年全国多校算法寒假训练营练习比赛(第二场)

    原文链接:2018年全国多校算法寒假训练营练习比赛(第二场) A 吐泡泡 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Form ...

  3. 牛客网 2018年全国多校算法寒假训练营练习比赛(第二场) A.吐泡泡-STL(stack)

    不好玩,一堆板子,太菜了,被打爆了,B一直wa60%,D一直wa80%,D改了多组输入就过了... A.吐泡泡 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...

  4. 牛客网 2018年全国多校算法寒假训练营练习比赛(第二场) H.了断局-递推

    H.了断局 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 链接:https://www.nowcode ...

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

    A-吐泡泡 链接:https://www.nowcoder.com/acm/contest/74/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...

  6. 牛客网 2018年全国多校算法寒假训练营练习比赛(第一场) 题解

    A-大吉大利,今晚吃鸡--枪械篇 题目描述 在绝地求生(吃鸡)游戏里,不同的枪支有不同的威力,更是可以搭配不同的配件,以提升枪支的性能. 每一把枪都有其威力及其可装备配件种类.每一个配件有其所属种类, ...

  7. 牛客网 2018年全国多校算法寒假训练营练习比赛(第二场) 题解

    A-吐泡泡 题目描述 小鱼儿吐泡泡,嘟嘟嘟冒出来.小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o". 两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉. ...

  8. 牛客网阶乘怪物C语言,【题集】牛客网·2018年全国多校算法寒假训练营练习比赛(第二场)(示例代码)...

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 小鱼儿吐泡泡,嘟嘟嘟冒出来.小鱼儿会吐出两种泡 ...

  9. 牛客网 2018年全国多校算法寒假训练营练习比赛(第三场)D.小牛vs小客-博弈

    菜哭... D.小牛vs小客 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 链接:https://ww ...

  10. 牛客网 2018年全国多校算法寒假训练营练习比赛(第五场) H.Tree Recovery-完全版线段树(区间更新、区间求和)...

    H.Tree Recovery 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 链接:https:/ ...

最新文章

  1. SQL查询或删除数据库中重复记录
  2. kattis ones简单题取模运算+枚举
  3. 《深度探索C++对象模型》--1 关于对象
  4. h.265编码库x265实例
  5. 二叉树的层序遍历—leetcode102
  6. js如何调用h5的日期控价_微信公众号支付H5调用支付解析
  7. 转载:使用 GNU Libtool 创建库
  8. mysql 4字节utf8_MySQL 4字节utf8字符更新失败一例
  9. Python 可变数据类型和不可变数据类型 - Python零基础入门教程
  10. 判断Logger级别是否开启的方法
  11. android xml对象,对象转成xml(并且序列化xml)在android中
  12. 网站如何集成支付宝!原来要给钱的
  13. Python+OpenCV摄像头人脸识别
  14. 手机浏览器和pc浏览器下载文件方法
  15. CentOS NFS
  16. moya + RxSwift 进行网络请求
  17. python 发送带附件邮件到钉钉邮箱+邮件内容带有表格
  18. 如何快速拷贝整个网站所有网页
  19. icp相关数学,向量模的平方转换成矩阵相乘
  20. Centos7 编译安装 图片压缩 MozJPEG

热门文章

  1. oracle的pending事务,请教pending的处理
  2. CSS 列表的样式 list-style-type、list-style-position和list-style-image 属性
  3. 字符编码的前世今生——一文读懂字符编码
  4. Go语言---strings包(字符串操作)
  5. 关于咕咕了很久的微信小程序
  6. 智慧数字经营,对于营业额的提升有哪些实际帮助?
  7. C#开发之——ComboBox(12.14)
  8. 乐华娱乐申请注册王一博战队 “一波王炸”商标 相关域名情况如何
  9. 金陵科技学院POCIB大赛颁奖仪式成功举行
  10. 团体程序设计天梯赛 L2-002 链表去重