A

思路:

  一看到'#''.'什么的就想到搜索怪我怪我。。。

  这道题勉强说是搜索别打我qwq

  1)因为不重复,所以首先要判断是否%5==0,若不满足,直接输出NO

  2)弄个vis数组记录是否被搜过,如果该处是‘#’并且没有被搜索过,就搜索他正下,左下,右下,以及下下是否都为#,若不是,输出NO

  3)如果是就进行标记(5个点都进行标记,因为只能使用一次),最终如果成功的渡劫,输出YES

坑点:

  搜索下方是x+1而不是x-1(吃亏了qwq)

上代码:

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdio>
  5. #include <cmath>
  6. using namespace std;
  7.  
  8. int n,cnt,tot;
  9. char w[][];
  10. bool vis[][];
  11. int dx[] = {, ,,-},
  12. dy[] = {,-,, };
  13.  
  14. bool check(int x,int y)
  15. {
  16. if(x>n || x< || y>n || y< || vis[x][y])
  17. return false;
  18. return true;
  19. }
  20.  
  21. void dfs(int x,int y)
  22. {
  23. for(int i=;i<;++i)
  24. {
  25. int xx=x+dx[i],yy=y+dy[i];
  26. if(!check(xx,yy))
  27. continue;
  28. if(w[xx][yy]=='#')
  29. tot++;
  30. }
  31. }
  32.  
  33. void dfs2(int x,int y)
  34. {
  35. for(int i=;i<;++i)
  36. {
  37. int xx=x+dx[i],yy=y+dy[i];
  38. vis[xx][yy]=true;
  39. }
  40. }
  41.  
  42. bool orz(int x,int y)
  43. {
  44. vis[x+][y]=true;
  45. tot=;
  46. dfs(x+,y);
  47. if(tot==)
  48. {
  49. dfs2(x+,y);
  50. return true;
  51. }
  52. return false;
  53. }
  54.  
  55. int main()
  56. {
  57. freopen("puzzle.in","r",stdin);
  58. freopen("puzzle.out","w",stdout);
  59. scanf("%d",&n);
  60. for(int i=;i<=n;++i)
  61. {
  62. scanf("%s",w[i]+);
  63. for(int j=;j<=n;++j)
  64. if(w[i][j]=='#')
  65. ++cnt;
  66. }
  67. if(cnt%)
  68. {
  69. printf("NO");
  70. return ;
  71. }
  72. else if(!cnt)
  73. {
  74. printf("YES");
  75. return ;
  76. }
  77. for(int i=;i<=n;++i)
  78. for(int j=;j<=n;++j)
  79. if(w[i][j]=='#' && !vis[i][j])
  80. {
  81. if(!orz(i,j))
  82. {
  83. printf("NO");
  84. return ;
  85. }
  86. }
  87. printf("YES");
  88. return ;
  89. }

B

思路:

  题目大整容!!!

  luoguP2816宋荣子搭积木

  贪心。

  1)先将所有的盒子按照承载量从小到大排序

  2)然后我们开一个数组,记录一下当前一共有多少列,每一列一共有多少个盒子。

  3)接着从小到大扫描所有的盒子,找到能放下的数量最多的列,把它放进去。

  4)如果没有任何一列能放下,则建一个新列。

上代码:

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstdio>
  4. using namespace std;
  5.  
  6. const int Maxn = 5e3 + ;
  7. int n,tot;
  8. int a[Maxn],b[Maxn];
  9.  
  10. inline void works()
  11. {
  12. for(int i=;i<=n;++i)
  13. if(!tot)///创造新列
  14. b[++tot]=;
  15. else {///Maxx用来记录上面放了多少块积木
  16. int Maxx=,flag=;
  17. for(int j=;j<=tot;++j)
  18. if(a[i]>=b[j] && b[j]>Maxx)
  19. Maxx=b[j],flag=j;
  20. if(!flag)///若积木不高兴了
  21. b[++tot]=;///再建一个列
  22. else///装入该列
  23. b[flag]++;
  24. }
  25. cout<<tot;
  26. }
  27.  
  28. int main()
  29. {
  30. freopen("box.in","r",stdin);
  31. freopen("box.out","w",stdout);
  32. scanf("%d",&n);
  33. for(int i=;i<=n;++i)
  34. scanf("%d",&a[i]);
  35. sort(a+,a++n);///记住一定要进行排序!!毕竟贪心嘛,,,
  36. works();
  37. return ;
  38. }

C

思路:

  题目大整容!

  luoguP1525关押罪犯

  三种做法

  1)普通并查集:

     i表示第i个学生,i+n为虚拟节点,表示不能和i在一个宿舍的人

    若两个点在同一并查集中,说明它们必须被分到同一个宿舍楼

    然后将所有的爱慕关系从大到小排序

    若a和b在同一并查集中,则此时c为答案

    若不在同一并查集,令a与b+n所在并查集合并,b与a+n所在并查集合并

  2)加权并查集:

    同样将所有爱慕关系从大到小排序

    每个点存储额外信息type,type为0表示和父亲结点在同一个宿舍楼,1表示和父亲结点不在同一个宿舍楼

    合并与查询的方式类似食物链

  3)二分+dfs(二分图染色问题):

    二分答案

    对于比二分答案大的爱慕关系,建图,

    显然若该图可以黑白染色,该答案可行,反之不可行

上代码:

给出普通并查集做法以及二分图做法~

①普通并查集做法

  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstdio>
  4. using namespace std;
  5.  
  6. int n,m,dad[];
  7.  
  8. struct node {
  9. int a,b,c;
  10. bool operator < (const node &qwq)const
  11. {///重载运算符
  12. return c > qwq.c;
  13. }
  14. }e[];
  15.  
  16. int getdad(int x)
  17. {return x == dad[x] ? x : dad[x]=getdad(dad[x]);}
  18.  
  19. int main()
  20. {
  21. freopen("love.in","r",stdin);
  22. freopen("love.out","w",stdout);
  23. scanf("%d %d",&n,&m);
  24. for(int i=;i<=n*;i++)
  25. dad[i]=i;///构建虚拟点
  26. for(int i=;i<=m;i++)
  27. scanf("%d %d %d",&e[i].a,&e[i].b,&e[i].c);
  28. sort(e+,e++m);
  29. for(int i=;i<=m;i++)
  30. {
  31. int f1=getdad(e[i].a),f2=getdad(e[i].b);
  32. if(f1==f2)
  33. {
  34. printf("%d",e[i].c);
  35. return ;
  36. }
  37. ///与虚拟点进行合并,表示不再一个宿舍中
  38. dad[f1]=getdad(e[i].b+n);///将f1与 b的补集合并
  39. dad[f2]=getdad(e[i].a+n);///将f2与 a的补集合并
  40. }
  41. ///若合法:
  42. printf("");
  43. return ;
  44. }

②二分图做法

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6.  
  7. const int N = , M = ;
  8. int n,m,ans;
  9. int W,w[M],col[N];
  10. struct node {
  11. int w,to,next;
  12. }e[M<<];
  13. int top,head[N];
  14. void add(int u,int v,int w) {
  15. top++;
  16. e[top].w=w;
  17. e[top].to=v;
  18. e[top].next=head[u];
  19. head[u]=top;
  20. }
  21.  
  22. bool dfs(int u,int c) {
  23. for(int i=head[u],v,w; i; i=e[i].next) {
  24. w=e[i].w;
  25. if(w<=W) continue;
  26. v=e[i].to;
  27. if(col[u]==col[v]) return false;
  28. if(!col[v]) {
  29. col[v]=-c;
  30. if(!dfs(v,col[v])) return false;
  31. }
  32. }
  33. return true;
  34. }
  35.  
  36. bool check() {
  37. memset(col,,sizeof(col));
  38. for(int i=; i<=n; i++)
  39. if(!col[i]) {
  40. col[i]=;
  41. if(!dfs(i,)) return false;
  42. }
  43. return true;
  44. }
  45.  
  46. int main() {
  47. scanf("%d%d",&n,&m);
  48. for(int i=,a,b,c; i<=m; i++) {
  49. scanf("%d%d%d",&a,&b,&c);
  50. add(a,b,c),add(b,a,c);
  51. w[i]=c;
  52. }
  53. sort(w+,w++m);
  54. int l=,r=m,mid;
  55. while(l<=r) {
  56. mid=(l+r)>>;
  57. W=w[mid];
  58. if(check()) ans=w[mid],r=mid-;
  59. else l=mid+;
  60. }
  61. if(l== && r<l) cout<<"";
  62. else printf("%d",ans);
  63. return ;
  64. }

日照学习提高班day3测试的更多相关文章

  1. 日照学习提高班day4测试

    A 思路: 一看到这个题,他不仅要求输出字典序最小的串,还要满足两两不重复,所以我们可以先输出ababab...什么的,最后缀上要求的k-2种字母 坑点: 当然这样想是不完全的!该题是拥有许多特殊情况 ...

  2. 夏令营提高班上午上机测试 Day 2 解题报告

    那一天,日照一中夏令营数据结构提高班的同学们终于想起了,被Day2上午的三道题支配的恐惧……   是的..这一天的题有点难想.. 本来打算前天写这篇随笔,然而前天在机房和同学打luogu月赛…… 昨天 ...

  3. 今天,Java编程周末提高班(第一期)正式结束

    Java编程周末提高班(第一期),走过了近两个月历程,一共同拥有68人次学生周末到老师家进行Java学习与交流.近距离的和一群年轻的学习接触,收获非常多,特别是对以后教学的改进.在学习的闲暇.大家自己 ...

  4. 老段带你学鸟哥Linux视频教程 包含基础班+提高班

    老段带你学鸟哥Linux视频教程 包含基础班+提高班,附带pdf文档. 目录结构如下: 目录:/-老段带你学鸟哥Linux视频教程 [.9G] ┣━━老段带你学鸟哥-服务器篇 [1009.4M] ┃ ...

  5. 学习版pytest内核测试平台开发万字长文入门篇

    前言 2021年,测试平台如雨后春笋般冒了出来,我就是其中一员,写了一款pytest内核测试平台,在公司落地.分享出来后,有同学觉得挺不错,希望能开源,本着"公司代码不要传到网上去,以免引起 ...

  6. 夏令营提高班上午上机测试 Day 3 解题报告

    今天的题的确水.T3还是一道NOIP原题. 嘛,多刷点水题也不是什么坏事嘛. 说来也快,夏令营结束了整一星期了呢.大家也都回到了日常的暑假生活呢. 今天学业水平测试出成绩了...嗯结果还算满意呢,至少 ...

  7. 夏令营提高班上午上机测试 Day 4 解题报告

    我要是没记错的话,今天的题难度算挺适中的. *标程来自高天宇哥哥 T1:小G的字符串 题目描述 有一天,小 L 给小 G 出了这样一道题:生成一个长度为 n 的.全由小写英文字母构成的字符串,只能使用 ...

  8. 夏令营提高班上午上机测试 Day 1 解题报告

    Day 1的题难度上来说不算太高,但是T2和T3还是有一定的思维量的. 一个比较好的开始.虽然AK的人只有几个.. (懒得去翻result了..忘了当时拿了多少分了 (哦,前两天我们机房是没有成绩的, ...

  9. 20180429NOIP提高组精英班Day1测试

随机推荐

  1. 基于keepalived搭建mysql双主高可用

    目录 概述 环境准备 keepalived搭建 mysql搭建 mysql双主搭建 mysql双主高可用搭建 概述 传统(不借助中间件)的数据库主从搭建,如果主节点挂掉了,从节点只能读取无法写入,只能 ...

  2. Ubuntu下安卓模拟器的选择

    8G内存的话,一般开个AS,再启动默认的模拟器的话,基本就有点卡了,如果再打开Idea,很容易卡死. 所以两个spingboot的后台服务只能直接命令行跑个jar包,不方便调试,webview加载的v ...

  3. Java EE javax.servlet中的ServletConfig接口

    ServletConfig接口 public interface ServletConfig 实现类:GenericServlet.HttpServlet 一.介绍 一个供servlet容器使用配置对 ...

  4. 21-Perl 发送邮件

    1.Perl 发送邮件如果你的程序在 Linux/Unix 系统上运行,你就可以在 Perl 中使用 sendmail 工具来发送邮件.以下是一个简单的脚本实例用于发送邮件:#!/usr/bin/pe ...

  5. imx8移植opencv(3.0以上版本)笔记

    基本步骤参考我同事的博客:https://blog.csdn.net/hunzhangzui9837/article/details/89846928 以下是在移植到imx8平台时的笔记和遇到的问题及 ...

  6. python检测域名

    pip install python-whois import whois print(whois.whois('baidu.com')) #输出有关baidu.com的所有域名

  7. MongoDB 基础增删改查

    增删改查 基础操作 use show dbs show collections db[当前所在数据库] 插入文档 db.collection.insert() db.collection.insert ...

  8. app欢迎页问题

    今天替换app中的图片,打包成apk后,欢迎页的图片怎么替换都还是旧的,尝试多次以后,确定以及肯定是替换成功了的,而且替换的也都对,只好清理了一下项目,重新build,最后再打包,结果成功了!真是坑! ...

  9. XML基础介绍【一】

    XML基础介绍[一] 1.XML简介(Extensible Markup Language)[可扩展标记语言] XML全称为Extensible Markup Language, 意思是可扩展的标记语 ...

  10. “联邦对抗技术大赛”9月开战 微众银行呼唤开发者共同“AI创新”

    “联邦对抗技术大赛”9月开战  微众银行呼唤开发者共同“AI创新”   从<第五元素>中的智能系统到<超体>中的信息操控,在科幻电影中人工智能已经发展到了极致.而在现实中,目前 ...