题1 牛跑步(running)

  1. 【题目描述】
  2.  
  3. 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场。从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 n 号,路口分别为 ...n- 号,从 A 农场到 B 农场有很多条路径可以到达,而 CG 发现有的路口是必须经过的,即每条路径都经过的路口,CG 要把它们记录下来,这样 CG 就可以先到那个路口,观察新牛们有没有偷懒,而你的任务就是找出所有必经路口。
  4.  
  5. 【输入格式】
  6.  
  7. 第一行两个用空格隔开的整数 n(≤n≤)和 e(≤e≤)。
  8.  
  9. 接下来从第 到第 e+ 行,每行两个用空格隔开的整数 p q,表示路口 p q 之间有路径直达。
  10.  
  11. 输入数据保证必经路口一定存在,并且每个路口都和 A 农场、B 农场相连通。
  12.  
  13. 【输出格式】
  14.  
  15. 第一行一个整数 m,表示必经路口的数目。
  16.  
  17. 第二行按从小到大的顺序依次输出每个必经路口的编号,每两个数之间用一个空格隔
  18.  
  19. 开。
  20.  
  21. 注意:不包括起点和终点。
  22.  
  23. 【输入样例】
  24.  
  25. 【输出样例】

题目

tag:dfs

思路:如果一个点是必须经过的,我们要找到它,不妨逆向的考虑。如果它不存在,点1和点n将不会连通。可以用floyd但时间不能保证,所以选择dfs。这里要注意,做这道题不能用以往的dfs套路,也就是说不能回溯,防止超时。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cmath>
  5. #define maxn 2010
  6. using namespace std;
  7. int n,m,vis[maxn],cnt,ans[maxn],Ans,hl[maxn],f;
  8. struct X{
  9. int u,v,ne;
  10. }e[maxn<<];
  11. int read()
  12. {
  13. int x=,flag=;
  14. char ch=getchar();
  15. while(ch<''||ch>''){
  16. if(ch=='-') flag=-;
  17. ch=getchar();
  18. }
  19. while(ch>=''&&ch<=''){
  20. x=x*+ch-'';
  21. ch=getchar();
  22. }
  23. return x*flag;
  24. }
  25. void add(int x,int y)
  26. {
  27. e[++cnt].u=x;
  28. e[cnt].v=y;
  29. e[cnt].ne=hl[x];
  30. hl[x]=cnt;
  31. }
  32. void dfs(int x)
  33. {
  34. if(vis[n]) return;
  35. vis[x]=;
  36. if(x==n) return;
  37. for(int j=hl[x];j;j=e[j].ne){
  38. int v=e[j].v;
  39. if(!vis[v]) dfs(v);
  40. }
  41. }
  42. int main()
  43. {
  44. //freopen("running.in","r",stdin);
  45. //freopen("running.out","w",stdout);
  46. int x,y;
  47. scanf("%d%d",&n,&m);
  48. for(int i=;i<=m;++i){
  49. x=read();y=read();
  50. add(x,y);
  51. add(y,x);
  52. }
  53. for(int i=;i<n;++i){
  54. memset(vis,,sizeof(vis));
  55. vis[i]=;
  56. f=;
  57. dfs();
  58. if(!vis[n]){
  59. ans[i]=;
  60. Ans++;
  61. }
  62. vis[i]=;
  63. }
  64. printf("%d\n",Ans);
  65. for(int i=;i<=n;++i) if(ans[i]) printf("%d ",i);
  66. return ;
  67. }

题 2 陈老师搬书(book.pas/c/cpp)

  1. 【问题描述】
  2.  
  3. 陈老师喜欢网购书籍,经常一次购它个百八十本,然后拿来倒卖,牟取暴利。前些天,高一的新同学来了,他便像往常一样,兜售他的书,经过一番口舌,同学们决定买他的书,但是 CS 桌上的书有三堆,每一堆都有厚厚的一叠,他要想个办法用最轻松的方式把书拿下来给同学们.但是你想逗一下 CS,于是,请你设计一个最累的方式给他.
  4.  
  5. 若告诉你这三堆分别有 i,j,k 本书,以及每堆从下到上书的重量.每次取书只能从任意一堆的最上面取,那么请你帮助他设计一个方案,让他花最大的力气取下所有书(CS 别打我).
  6.  
  7. 显然,每次取书,陈老师的体力消耗都会加大,这里用体力系数代表,取下第一本书时,体力系数为 ,第二本时为 ,依次类推,而每次体力消耗值则为体力系数和书的重量之积。
  8.  
  9. 举个例子:
  10.  
  11. 三堆书及重量如下
  12.  
  13. (配图在外)
  14.  
  15. 不用证明,最累的取书方式为: 右左左中, 即: *+*+*+*=+++= 【输入文件】(book.in
  16.  
  17. 输入文件的第一行为 个数,分别为三堆数量 I,j,k 第二行至第四行分别为每堆由下至上的书本重量
  18.  
  19. 【输出文件】(book.out
  20.  
  21. 输出最累方式的体力消耗总值即可
  22.  
  23. 【输入样例】
  24.  
  25. 【输出样例】
  26.  
  27. 【注释】:
  28.  
  29. 输入数据为每堆由下至上的书本重量!
  30.  
  31. 【数据规模】
  32.  
  33. 对于 %的数据有:<=i< <=j< <=k<
  34.  
  35. 对于 %的数据有:<=i< <=j< <=k<
  36.  
  37. 最后输出的体力消耗总值在 longint 范围内

题目

tag:背包DP

思路:一道比较基础的DP,需要准确找到继承关系。我们用f[i][j][k]表示选择i本第一堆的书+j本+k本的最优解,可得dp方程f[i][j][k]=max(f[i][j][k],f[i-1][j][k]+a1[i]*(i+j+k),f[i][j-1][k]+a2[j]*(i+j+k),f[i][j][k-1]+a3[k]*(i+j+k));书的选择有先决条件(它上面的必须已经被选)当然不能用贪心,可以举反例来验证。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cmath>
  5. #include<stack>
  6. using namespace std;
  7. long f[][][];
  8. int a1[],a2[],a3[],k1,k2,k3,i,j,k;
  9. int main()
  10. {
  11. //freopen("book.in","r",stdin);
  12. //freopen("book.out","w",stdout);
  13. scanf("%d%d%d",&k1,&k2,&k3);
  14. for(i=k1;i>;--i) scanf("%d",&a1[i]);
  15. for(i=k2;i>;--i) scanf("%d",&a2[i]);
  16. for(i=k3;i>;--i) scanf("%d",&a3[i]);
  17. for(i=;i<=k1;++i)
  18. for(j=;j<=k2;++j)
  19. for(k=;k<=k3;++k){
  20. if(i>=) f[i][j][k]=max(f[i][j][k],f[i-][j][k]+a1[i]*(i+j+k));
  21. if(j>=) f[i][j][k]=max(f[i][j][k],f[i][j-][k]+a2[j]*(i+j+k));
  22. if(k>=) f[i][j][k]=max(f[i][j][k],f[i][j][k-]+a3[k]*(i+j+k));
  23. }
  24. printf("%ld\n",f[k1][k2][k3]);
  25. return ;
  26. }

题 3 背单词(words)

  1. 【问题描述】
  2.  
  3. 英语四级考试临近了,小 Y 却发现他已经把以前学的单词几乎忘光了。好在现在离考试还有一段时间,小 Y 决定从现在开始夜以继日地背单词。也就是说小 Y 废寝忘食,一天二十四小时地背单词。
  4.  
  5. 今天的日期(时间)是 YYYY mm dd hh min 分,考试的时间是 YYYY’年 mm’月dd’日 hh’时 min’分。这之间的所有时间小 Y 都用来背单词了,那么考试之前他最多能背多少个单词呢?
  6.  
  7. 时间紧张,小 Y 只管数量不管质量。当然有的单词长一些,有的单词短一些。长的单词难背一些,短的单词好背一些。根据小 Y 的经验,他能一眼看出背某一个单词需要的时间,以分钟记。
  8.  
  9. 现在给你一个字典,请你挑出最多的单词使小 Y 能在考试前背出来。【输入格式】
  10.  
  11. 第一行一个整数 N,表示字典中的单词数,N<=。
  12.  
  13. 接下来 N 行,每行一个整数表示背这个单词需要用的时间,以分钟记,小于等于 。(这个单词本身是什么并不重要,不是吗?当前小 Y 已经认识的单词数为 个)。
  14.  
  15. 接下来两行依次是当前时问和考试时间。时间给出的格式是:yyyy-mm-dd-hh:min.例
  16.  
  17. 如:---:,采用 小时制,每天从 :-:,年份从
  18.  
  19. 【输出格式】
  20.  
  21. 一行一个数,表示考试前小 Y 最多能背出的单词数:【输入样例】
  22.  
  23. ---:
  24.  
  25. ---:
  26.  
  27. 【样例输出】

题目

tag:模拟 贪心

思路:直接算两个点的时间差需要无数个特判,难度太大,应转为从0000年的起始时间点开始计算,取整年整月比较好算。注意闰年。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cmath>
  5. #include<queue>
  6. using namespace std;
  7. priority_queue<int>Q;
  8. int cnt,n,x,ans,yue[]={,,,,,,,,,,,,},run[],c[];
  9. long long t,t1,t2;
  10. struct X
  11. {
  12. int year,month,day,hour,min;
  13. }a,b;
  14. int read()
  15. {
  16. int x=,flag=;
  17. char ch=getchar();
  18. while(ch<''||ch>''){
  19. if(ch=='-') flag=-;
  20. ch=getchar();
  21. }
  22. while(ch>=''&&ch<=''){
  23. x=x*+ch-'';
  24. ch=getchar();
  25. }
  26. return x*flag;
  27. }
  28. void dabiao()
  29. {
  30. for(int i=;i<=;++i)
  31. if(i%==){
  32. run[i]=;
  33. if((i%==)&&(i%!=)) run[i]=;
  34. }
  35. }
  36. void work()
  37. {
  38. t1=t2=;
  39. for(int i=;i<a.year;++i) t1+=(+run[i])*;
  40. for(int i=;i<a.month;++i) t1+=yue[i]*;
  41. t1+=(a.day-)*;
  42. t1+=a.hour*;
  43. t1+=a.min;
  44. for(int i=;i<b.year;++i) t2+=(+run[i])*;
  45. for(int i=;i<b.month;++i) t2+=yue[i]*;
  46. t2+=(b.day-)*;
  47. t2+=b.hour*;
  48. t2+=b.min;
  49. t=t2-t1;
  50. }
  51. int main()
  52. {
  53. //freopen("words.in","r",stdin);
  54. //freopen("words.out","w",stdout);
  55. dabiao();
  56. scanf("%d",&n);
  57. for(int i=;i<=n;++i) scanf("%d",&c[i]);
  58. sort(c+,c+n+);
  59. a.year=read();a.month=read();a.day=read();a.hour=read();a.min=read();
  60. b.year=read();b.month=read();b.day=read();b.hour=read();b.min=read();
  61. work();
  62. for(int i=;i<=n;++i){
  63. if(t>=c[i]) ans++;
  64. else break;
  65. t-=c[i];
  66. }
  67. cout<<ans<<endl;
  68. return ;
  69. }

题 4 征兵

  1. 【问题描述】
  2.  
  3. W 拥有一个国家,现在他希望建立一支军队来保护他的国家。他选中了 N 个女孩和 M 个男孩希望招募他们成为他的士兵。在没有任何先决条件的情况下,他招募一个士兵需要花费 10000RMB。现在小 W 可以利用这些人之间的关系来减少他的花费。如果女孩 X 和男孩 Y 存在有一个关系值 D(两人之间可能有多个关系值),而且她们之中有一个人被招募了。那么小 W 可以在招募另一个人的时候减少 D 的花费(实际 -D 的费用)。
  4.  
  5. 现在给你这些男孩女孩之间的关系,希望你告诉小 W 告诉他招募所有人的最少花费。注意:招募某一个人时,只能利用一个关系。
  6.  
  7. 【输入格式】
  8.  
  9. 输入文件 conscription.in 中文件第一行包含三个整数 NMR。表示 N 个女孩,M 个男孩与 R 条关系。
  10.  
  11. 接下来 R 行,每行包含三个整数 XiYi Di,表示女孩 Xi 和男孩 Yi Di 的关系。
  12.  
  13. 【输出格式】
  14.  
  15. conscription.out 中只有一行一个数为最小费用。
  16.  
  17. 【输入输出样例】
  18.  
  19. conscription.in
  20.  
  21. conscription.out
  22.  
  23. 【数据规模】
  24.  
  25. %的数据:<=N, M<=,<=R<=,, <di<

题目

tag:最小生成树

思路:kruscal求最小生成树,稍作处理得出答案。可以用10000*人数再减去所有生成树的边权,也可以像我这样最后查祖先数,每个祖先要花费10000的钱。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cmath>
  5. #define maxn 100010
  6. using namespace std;
  7. long long ans;
  8. int cnt,fa[maxn<<],n,m,r,i,x,y,d,tot;
  9. struct X{
  10. int u,v,w;
  11. }e[maxn<<];
  12. void add(int x,int y,int w)
  13. {
  14. e[++cnt].u=x;
  15. e[cnt].v=y;
  16. e[cnt].w=w;
  17. }
  18. int find(int x)
  19. {
  20. return x==fa[x]?x:fa[x]=find(fa[x]);
  21. }
  22. bool cmp(X a,X b)
  23. {
  24. return a.w<b.w;
  25. }
  26. int main()
  27. {
  28. //freopen("conscription.in","r",stdin);
  29. //freopen("conscription.out","w",stdout);
  30. scanf("%d%d%d",&n,&m,&r);
  31. for(i=;i<n+m;++i) fa[i]=i;
  32. for(i=;i<=r;++i){
  33. scanf("%d%d%d",&x,&y,&d);
  34. add(x,y+n,-d);
  35. add(y+n,x,-d);
  36. }
  37. sort(e+,e+cnt+,cmp);
  38. for(i=;i<=cnt;++i){
  39. int u=e[i].u,v=e[i].v,w=e[i].w;
  40. int k1=find(u),k2=find(v);
  41. if(k1!=k2){
  42. fa[k1]=k2;
  43. ans+=w;
  44. tot++;
  45. }
  46. if(tot+==n+m) break;
  47. }
  48. cnt=;
  49. for(i=;i<n+m;++i) if(fa[i]==i) cnt++;
  50. ans+=cnt*;
  51. cout<<ans<<endl;
  52. return ;
  53. }

┈━═┈━═┈━═┈━═┈━═┈━═┈━═┈━═依旧华丽的分割线┈━═┈━═┈━═┈━═┈━═┈━═┈━═┈━═☆

  芒果君:这次考试比上次高了10分啊233333333我居然进步了(不)。本来准备昨天下午写解题报告结果一直浪到现在OTZ考试的话还是比较缺乏经验,好多分都没拿到,而且还出了freopen里words写成book的爆0惨案QAQ 不过下次也要加油哦~

冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱的更多相关文章

  1. 冲刺Noip2017模拟赛1 解题报告——五十岚芒果酱

    题1 国际象棋(chess) [问题描述] 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加2场对弈,最少参加0场对弈.每个人都有一个与其他人都不相同的等级(用一个正整数来表示).在对 ...

  2. 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱

    1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...

  3. 冲刺Noip2017模拟赛3 解题报告——五十岚芒果酱

    题1  素数 [问题描述] 给定一个正整数N,询问1到N中有多少个素数. [输入格式]primenum.in 一个正整数N. [输出格式]primenum.out 一个数Ans,表示1到N中有多少个素 ...

  4. 冲刺Noip2017模拟赛8 解题报告——五十岚芒果酱

    1.鼎纹 [问题描述] 据说鼎纹的 种制造 式是 铜模印出来的,这是我国古代劳动 智慧 的结晶.铜模印过的地 ,会留下深深的印记,经过时间的炼化,洗 练成历史的遗存. 聪明的古代劳动人民拥有一个 a ...

  5. 冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱

    1.二叉树(binary) .二叉树 (binary.cpp/c/pas) [问题描述] 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: ()若左子树不空,则左子树上所有结点的值均小于它的根结 ...

  6. 冲刺Noip2017模拟赛6 解题报告——五十岚芒果酱

    1.ksum(ksum) [问题描述] Peter喜欢玩数组.NOIP这天,他从Jason手里得到了大小为n的一个正整数 数组. Peter求出了这个数组的所有子段和,并将这n(n+)/2个数降序排序 ...

  7. 冲刺Noip2017模拟赛4 解题报告——五十岚芒果酱

    题1 韬韬抢苹果(apple) [问题描述] 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹 果.每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了 ...

  8. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  9. 【HHHOJ】NOIP模拟赛 玖 解题报告

    点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...

随机推荐

  1. 总结 1121 Java面向对象

    总结 Java面向对象的基础 三大特征: 封装(抽象),继承,多态 面向对象的内存分析: 栈, 堆, 代码区, 静态区 this: 代表当前对象本身 有时候需要把当前调用对象进行传递,那么就可以使用t ...

  2. 基于Web的文件上传管理系统

    一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不能这样上传了.我这里分享一下我自己开发的一套大文件上传控件 ...

  3. 23333 又是一篇水文章(以下是各种复制来的关于maven转成eclipse项目)

    (转载) 当我们通过模版(比如最简单的maven-archetype-quikstart插件)生成了一个maven的项目结构时,如何将它转换成eclipse支持的java project呢? 1. 定 ...

  4. Redis使用Docker镜像安装

    详细见本人以下文档: https://www.cnblogs.com/zyc-blogs/p/9621727.html

  5. 服务器 Web服务器 应用服务器区别联系

    服务器: 通俗的讲,我们访问一个网站就相当于访问一个服务器的文件,如果想要通过自己的域名来访问一个网站,首先得将域名部署到你的服务器上,然后就可以通过域名访问到你服务器上的网 页文件.ip地址就相当于 ...

  6. 在使用vagrant访问PHP文件是报错“file not found”,好像是最新的NGINX不能识别document_root,只能改为自己的项目目录/vagrant_data

    出现该错误有很多可能,有可能是root配置不对,有可能是fastcgi_param SCRIPT_FILENAME参数不对等. 而本人遇到的也是参数不对,但是是一个比较少人提及的问题,nginx版本不 ...

  7. Linux 下基础命令

    Linux:开源 Ubuntu Centos Deepin Debian Linux mint ... 1.省钱 2.省资源 Linux由unix演化而来 Linux:开源 Unix: 闭源 sola ...

  8. 高性能高可用的微服务框架TarsGo的腾讯实践

    conference/2.3 高性能高可用的微服务框架TarsGo的腾讯实践 - 陈明杰.pdf at master · gopherchina/conferencehttps://github.co ...

  9. 强悍的Python读取大文件的解决方案

    这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适合读取大文件. 1. read() 接口的问题 f =open(filename, ...

  10. tomcat 8.xxx ssl使用websocket Failed to close the ServletOutputStream connection cleanly

    报错: 2019-09-17 10:30:17.277 default [https-jsse-nio-8110-exec-20] INFO o.a.t.w.s.WsRemoteEndpointImp ...