总分:100分

T1,小凯的疑惑, 100分

T2,时间复杂度,0分

T3,逛公园,0分


T1

###题意简化:

给定两个互质的数字,输出最大不能表示的数;

基础数论题目

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. inline long long read()
  4. {
  5. int x=0,f=1;char ch=getchar();
  6. while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
  7. while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
  8. return x*f;
  9. }
  10. int main()
  11. {
  12. long long a,b;
  13. a=read(),b=read();
  14. cout<<a*b-a-b;
  15. return 0;
  16. }

T2:

解题思路:

对于模拟题:学到了一点:模块化,尽量处理的时候分开,不然凑一起真炸的满天飞

1.就是输入的问题,输入t组数据肯定没有什么问题

2.输入循环体的时候,我在考试的时候选择了字符读入,然后我人傻了,不知道怎么做了,学长讲的那就是直接string code[105],然后就可以表示了,

3.对于第一个板块,也就是我们首先要处理的东西,那就是字符串中的数字,(代码中就是calc--计算器),这个确有巧妙,当时我因为字符读入,直接减去'0';

注:原来题目给定的时间复杂度一样这么求,只不过在前面进行稍微判别,函数名为 geto();

4.对于第二个板块,在进行我们主体部分,进行大模拟,模拟首先就是我们要考虑我们碰上'F'之后的事情

(1).我们肯定需要把这个循环的迭代器找出来也就是 code[i][2],我们直接以一个bool数组表示它是否已经用过了,如果用过,那么就是编译错误;

(2).我们将循环变量压入栈中,会发现,和括号的匹配很像

(3).我们用a,b取出i,j

如果 b<a ,那么没有进入循环。用一个 flag 来保存最早的没有没有进入的 k。

如果都进入了,则flag为-1。

如果 a<=b ,代表进入循环,此时若 b-a>1000 并且 flag 为 -1 ,则本层循环对复杂度有贡献,执行 now++ 操作。

同时我们用 ef[26] 保存 now++ 时 k的信息**(ef[k]=true)。(在k出栈时now - -,ef[k]=false)并更新res。(res=max(res,now))

5.那碰上‘E’呢

(1).首先我们看下栈,空,代表'F'已经没有了,但是‘E’还有,不匹配

(2).计算一下时间复杂度

(3).在最后的时候看一下‘F’有没有剩下;

经过九九八十一难,肝出来了,就是全力的模拟每一种情况,需要大量的耐心和清晰的头脑(我感觉我脑袋已经炸了)

  1. #include<cstdio>
  2. #include<stack>
  3. #include<string>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. const int maxl=105;
  8. int t,l,w;
  9. string o;
  10. string code[maxl];
  11. int calc(int &x,string c)
  12. {
  13. int res=0;
  14. int len=c.size();
  15. while(c[x]<'0' || c[x]>'9'&&x<c.size()) {
  16. if(c[x]=='n'){
  17. ++x;
  18. return 1000000;
  19. }
  20. ++x;
  21. }
  22. while(c[x]>='0' && c[x]<='9') {
  23. res*=10;res+=c[x]-'0';
  24. ++x;
  25. }
  26. return res;
  27. }
  28. int geto() {
  29. int res=0,x=3;
  30. int len=o.size();
  31. if(o[2]=='n') res=calc(x,o);
  32. else res=0;
  33. return res;
  34. }
  35. int check() {
  36. int res=0,now=0;
  37. int a,b,x;
  38. stack<int> s;
  39. int flag=-1;
  40. bool ins[26]={0};
  41. bool ef[26]={0};
  42. for(int i=1;i<=l;i++) {
  43. if(code[i][0]=='F') {
  44. int k=code[i][2]-'a';
  45. if(ins[k]) return -1;
  46. s.push(k);ins[k]=true;
  47. x=4;
  48. a=calc(x,code[i]);b=calc(x,code[i]);
  49. if(b-a>1000)
  50. {
  51. if(flag==-1)
  52. {
  53. now++;
  54. res=max(res,now);
  55. ef[k]=true;
  56. }
  57. }
  58. if(a>b) {
  59. if(flag==-1) flag=k;
  60. }
  61. }
  62. if(code[i][0]=='E') {
  63. if(s.empty()) return -1;
  64. int k=s.top();
  65. s.pop();ins[k]=false;
  66. if(flag==k) flag=-1;
  67. if(ef[k]) {
  68. ef[k]=false;
  69. now--;
  70. }
  71. }
  72. }
  73. if(s.size()) return -1;
  74. return res;
  75. }
  76. int main() {
  77. scanf("%d",&t);
  78. while(t--) {
  79. int ww;
  80. scanf("%d ",&l); getline(cin,o);
  81. w=geto();
  82. for(int i=1;i<=l;i++) getline(cin,code[i]);
  83. ww=check();
  84. if(ww==-1) printf("ERR\n");
  85. else {
  86. if(ww==w) printf("Yes\n");
  87. else printf("No\n");
  88. }
  89. }
  90. }

T3:

题意简化:

一个有向无重边自环图,设D为从1号点走到n号点的最短距离。问有多少条从1到n的路径长度不超过D+K。K为给定的值,且K≤50,如果有无数条,输出-1

题意分析

首先看一下,k的取值,k≤50,就很容易想到DP,所以我们考虑一下,题目到底怎么DP

1. 对于正常的图来说,它怎么也不可能有无穷条最短路(我们假设k=0的时候),那么也就只有有0环的时候才会出现这种情况,

2.那么我们设一个二维数组 lh[u][x](轮回),表示 节点 U比最短路多出 x 的距离

注:除了0环,不可能相等,相等的时候那就是说明我们在上一个节点走到这的时候返回这个点,节省复杂度

3.然后我们就去寻找比最短路小 k的价值的答案(也就是边数)

4.那么我们也可以设一个二维数组 f[u][x]表示节点 i到 n走了x的多余价值,

5.然后就A掉了

  1. 然后发现不会:
  2. 那就暴力一下,数据很良心,给了k=0的情况,那就十分类似于[路径统计](https://www.luogu.com.cn/problem/P1608)。
  3. 之后我们就开始正解了

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <queue>
  7. #define inf 0x3f
  8. using namespace std;
  9. const int maxn=1e5+10;
  10. struct node
  11. {
  12. int nxt, to,weath;
  13. };
  14. node edge1[maxn<<1],edge2[maxn<<1];
  15. int head1[maxn<<1],head2[maxn<<1];
  16. int number_edge1,number_edge2;
  17. int n,m,k,p;
  18. //===============正反建图=================
  19. void add1(int from,int to,int weath)
  20. {
  21. number_edge1++;
  22. edge1[number_edge1].nxt=head1[from];
  23. edge1[number_edge1].to=to;
  24. edge1[number_edge1].weath=weath;
  25. head1[from]=number_edge1;
  26. }
  27. void add2(int from,int to,int weath)
  28. {
  29. number_edge2++;
  30. edge2[number_edge2].nxt=head2[from];
  31. edge2[number_edge2].to=to;
  32. edge2[number_edge2].weath=weath;
  33. head2[from]=number_edge2;
  34. }
  35. inline int read()
  36. {
  37. int x=0,f=1;char ch=getchar();
  38. while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
  39. while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
  40. return x*f;
  41. }
  42. //=======标准spfa=========
  43. int dis[maxn],vis[maxn];
  44. queue<int> q;
  45. void spfa(int x)//标准spfa
  46. {
  47. memset(dis,0x3f,sizeof(dis));
  48. memset(vis,0,sizeof(vis));
  49. dis[x]=0;
  50. //vis[x]=1;
  51. q.push(x);
  52. while(!q.empty())
  53. {
  54. int u=q.front();
  55. q.pop();
  56. vis[u]=0;
  57. for(int i=head2[u];i;i=edge2[i].nxt)
  58. {
  59. int v=edge2[i].to;
  60. if(dis[v]>dis[u]+edge2[i].weath)
  61. {
  62. dis[v]=dis[u]+edge2[i].weath;
  63. if(!vis[v])
  64. {
  65. q.push(v);
  66. vis[v]=1;
  67. }
  68. }
  69. }
  70. }
  71. }
  72. //出现了无穷条,意味着出现了0环,那么标记一下,用的数组 lh(轮回)
  73. int lh[maxn<<1][60],f[maxn<<1][60];
  74. //lh的右数组为什么开60,因为出现0环,在这个环上,无论那一个点,哪一种情况都将是 j的距离
  75. //f[i][j]表示 从i号点到 n号点走了 j的多余路径
  76. //=================寻找路径==============
  77. int dfs(int u,int x)
  78. {
  79. if(lh[u][x]==2) return f[u][x];//从别的点出发到达了这个点,
  80. if(lh[u][x]==1) return -1;
  81. lh[u][x]=1;
  82. for(int i=head1[u];i;i=edge1[i].nxt)
  83. {
  84. int v=edge1[i].to;
  85. int w=x-(dis[v]+edge1[i].weath-dis[u]);
  86. if(w<0 || w>k) continue;
  87. int val=dfs(v,w);
  88. if(val==-1) return -1;//有0环
  89. f[u][x]+=val;
  90. f[u][x]%=p;
  91. }
  92. lh[u][x]=2;
  93. return f[u][x];
  94. }
  95. int main()
  96. {
  97. int t=read();
  98. while(t--)
  99. {
  100. memset(head1,0,sizeof(head1));
  101. number_edge1=0;
  102. memset(head2,0,sizeof(head2));
  103. number_edge2=0;
  104. memset(lh,0,sizeof(lh));
  105. memset(f,0,sizeof(f));
  106. n=read(),m=read(),k=read(),p=read();
  107. for(int i=1;i<=m;i++)
  108. {
  109. int u=read(),v=read(),w=read();
  110. add1(u,v,w);
  111. add2(v,u,w);
  112. }
  113. spfa(n);
  114. f[n][0]=1;
  115. int ans=0;
  116. for(int i=0;i<=k;i++)
  117. {
  118. int judge=dfs(1,i);
  119. if(judge==-1)
  120. {
  121. ans=-1;
  122. }
  123. else
  124. {
  125. ans+=judge;
  126. ans%=p;
  127. }
  128. }
  129. printf("%d\n",ans);
  130. }
  131. return 0;
  132. }

最后的总结:

对于任何一道题来说,如果不会,先放一下,看一下后面的题是否可以做,拿部分分也是可以的,T2模拟模拟不出来却非要一直模拟,结果,T3就只有30分钟的时间,最后还编译出错了。

NOIP 2017 Day1 解题报告的更多相关文章

  1. 学大伟业Day1解题报告

    学大伟业Day1解题报告 张炳琪 一.   时间分配 T1:30分钟  T2: 60分钟  T3:100分钟 二.答题情况及错因 T1:100         T2:55             T3 ...

  2. CH Round #54 - Streaming #5 (NOIP模拟赛Day1)解题报告

    最近参加了很多CH上的比赛呢~Rating--了..题目各种跪烂.各种膜拜大神OTZZZ T1珠 描述 萌蛋有n颗珠子,每一颗珠子都写有一个数字.萌蛋把它们用线串成了环.我们称一个数字串是有趣的,当且 ...

  3. 2017.9.17校内noip模拟赛解题报告

    预计分数:100+60+60=220 实际分数:100+60+40=200 除了暴力什么都不会的我..... T1 2017.9.17巧克力棒(chocolate) 巧克力棒(chocolate)Ti ...

  4. 2017.7.15清北夏令营精英班Day1解题报告

    成绩: 预计分数:20+10+40 实际分数:100+10+40. 一百三十多人的比赛全场rand7还水了个鼠标+键盘 unbelievable! 考试题目链接: https://www.luogu. ...

  5. [雅礼NOIP集训 2017] number 解题报告 (组合数+二分)

    题解: 令$S(i)={i+1,i+2,...,i<<1}$,f(i,k)表示S(i)中在二进制下恰好有k个1的数的个数 那么我们有$f(i,k)=\sum_{x=1}^{min(k,p) ...

  6. NOIP2018提高组Day1 解题报告

    前言 关于\(NOIP2018\),详见此博客:NOIP2018学军中学游记(11.09~11.11). 这次\(NOIP\ Day1\)的题目听说很简单(毕竟是三道原题),然而我\(T3\)依然悲剧 ...

  7. 常州培训 day1 解题报告

    第一题:(骗分容易,AC难.) 题目大意: 给出一个字符串,找出满足条件A的区间的个数.A:字符A,B,C的出现次数相同. 都出现0次也算,区间的长度可以是0(就是只有一个数).30% |S| ≤ 1 ...

  8. 2017 SCNUCPC 解题报告

    校内赛题目.解题思路.参考代码一览 A. Blackstorm's Blackstore Problem Description Blackstorm is going to open a black ...

  9. NOIP 2018 D1 解题报告(Day_1)

    总分   205分 T1 100分 T2  95分 T3  10分 T1: 题目描述 春春是一名道路工程师,负责铺设一条长度为 nn 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是  ...

随机推荐

  1. Ansys Student 2020R2中Fluent编译UDF简介

    使用内建编译器 在Ansys Fluent中编译UDF一般都需要额外安装相应版本的Visual Studio编译器,VS的缺点是体量大,占空间,安装后还需要额外进行相关设置才能正常使用.而新版本的An ...

  2. 烽火服务器IPMI远程装机

    连接控制台 一.通过vpn拨入进入内网,使用IE浏览器或者火狐等等,连接ilo地址.(需要安装java8.0,各个品牌的服务器需要的不一样) 二.启动虚拟连接控制台,进行控制主机 三.根据截图进行操作 ...

  3. Java (四)APACHE Commons IO 复制文件

    上一篇:Java (三)APACHE Commons IO 常规操作 例1:复制文件 1 import java.io.File; 2 import java.io.IOException; 3 4 ...

  4. Java数组以及内存分配

    Java数组以及内存分配 什么数组(简) 数组初始化 动态初始化 静态初始化 内存分配问题(重) 数组操作的两个常见小问题 什么是数组: 定义格式: 数组类型 [] 数组名 ; 如:常用格式,其他方式 ...

  5. Java安全之Commons Collections1分析(一)

    Java安全之Commons Collections1分析(一) 0x00 前言 在CC链中,其实具体执行过程还是比较复杂的.建议调试前先将一些前置知识的基础给看一遍. Java安全之Commons ...

  6. 微服务 | Spring Cloud(一):从单体SSM 到 Spring Cloud

    系列文章目录 微服务 | Spring Cloud(一):从单体SSM 到 Spring Cloud 目录 系列文章目录 前言 单体式架构 微服务架构 优点 缺点 服务发现与弹性扩展 参考 前言 在微 ...

  7. win10简单方法安装杜比v4音效!win10 1909适用!

    先下载这个! 链接: https://pan.baidu.com/s/1zAOOf-1aCJsjBgy36SiGWA 密码: s9n7 这个是杜比V4文件,257MB大小,适用32位64位系统!下 载 ...

  8. 多测师讲解python _函数return_高级讲师肖sir

    # 函数中的返回的作用: 注意点:(1)调用函数===没有加print 调用函数为空,加了print调用函数打印输出none              (2)在函数中碰到return语句赋值直接返回r ...

  9. centos7虚拟机时间和本地时间相差8小时

    安装ntp和ntpdate 在安装centos7虚拟机的时候,已经将时区设置为了Asia/shanghai,但还是出现时间不准,相差了8小时 可以安装ntp和ntpdate,使用 NTP 公共时间服务 ...

  10. oh my zsh 常用插件

    date: "2020-10-18T12:36:00+08:00" title: "oh my zsh 常用插件" tags: ["zsh" ...