【洛谷新手村解题报告二】

  • 循环!循环!循环!
  • 数组

继续上次的一!开始循环第二题

循环!循环!循环!

第二题 级数求和 [1/2]

已知:Sn= 1+1/2+1/3+…+1/n
显然对于任意一个整数 k,当 n足够大的时候,Sn>k ​
现给出一个整数 k,要求计算出一个最小的 n,使得 Sn>k

Sol 1
那就直接模拟呗!第i项的分母为i,结果每次增加1.0/i 判断哪次大于k则跳出
Sol 2
那首先看一下Sn的求和公式,有点眼熟啊!应该是个调和级数
它有个近似公式
Sn=logen 当n为有限时
Sn=logen + R 当n取向无穷时 R为欧拉常数,约为0.5772。
Sn是单调递增的,那题目说的没错,那就任意k都有解了。
用第二个公式带入, Sn=ln n +R > k
ln n > k-R
n > ek-R
然后输出: floor(exp(k-R)+0.5); //四舍五入
注意:公式要代第二个,代第一个不精确的会有大问题
R不足够精确会有大问题,一般要带入小数点后7-10位
没有四舍五入会有大问题。。
不太清楚为什么会有这么多大问题 就当思考了吧w

第三题 小玉在游泳 [1/2]

已知小玉第一步能游2米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的98%。现在小玉想知道,如果要游到距离x米的地方,她需要游多少步呢。

Sol 1 直接模拟大法 [字母可能和题目里面不太一样,习惯不太好]
类似第二题,记录每一步能游tmp米,每次tmp*=0.98 ,每次累积游了now+=tmp
再判断>k了吗

 int p=0;double k,now=0,tmp=2;cin >> k;while(now<k){now+=tmp;tmp*=0.98;p++;}cout << p;

sol 2 数学计算
题目易得是个等比公式,我们有等比求和公式
Sn=a1*(1-qn)/(1-q)
化简一下,得到
qn=1 - Sn*(1-q)/a1
因为C语言中我们只能用log10 和loge 即 log10()函数 和 log() 函数
我们利用换底公式
logab=logcb / logca
可以得到: n=loge(1-Sn*(1-q)/a1)/logeq
然后再向上取整利用ceil()函数 即可得到答案

double k,q=0.98,a1=2.0;cin >> k;cout << ceil(log(1.0-k*(1-q)/a1)/log(q));

第四题 小鱼的航程(改进版) [2/2]

有一只小鱼,它平日每天游泳 250 公里,周末休息(实行双休日),假设从周x(1≤x≤7) 开始算起,过了n(n≤106 ) 天以后,小鱼一共累计游泳了多少公里呢?

嘿嘿,这题没有啥计算公式了吧?不过我们还是有两个解法。
Sol 1 直接模拟啊
判断今天是不是非周末,非周末那就游250吧! 然后周+1 如果是第七周那周=1
然后循环判断n次

算法复杂度 O(n)

int x,n,ans=0;cin >> x >> n;for(int i=1;i<=n;++i){if(x>=1 && x<=5)ans+=250;if(x==7)x=1;else x++;}cout << ans;

Sol 2 算下要游多少天啦
因为如果某一周都要游的话,那么每周都要游250*5 那判断一下第一周和最后一周的条件就ok了,不过写法判断很苛刻

算法复杂度 O(1)

ll x,n,ans=0;cin >> x >> n;if(x==6 || x==7){        //判断第一周不游了n=max(0ll,n-(7-x+1));   //总天数减去第一周周末的时间,注意可能会小于0}else{                   //第一周要游的if(x+n>=6){            //第一周会至少游到周五ans=ans+5-x+1;   //游的天数=x到周五的差n=n-(7-x+1);    //总天数减掉第一周}else{                //第一周游不到周六了ans=ans+n;     //n是几就游几天n=0;          //n清空吧}}ans=ans+n/7*5;            //游的天数加上总周数*5ans=ans+min(n%7,5ll);    //再判断多出来最后一周的情况cout << ans*250;       //天数*250

什,这么绕?还好题目n≤106 不然再大些只能用算法二了。
第五题 计数问题 [2/2]

试计算在区间 1 到 n的所有整数中,数字 x(0≤x≤9)共出现了多少次?
例如,在 1到 11中,即在 1,2,3,4,5,6,7,8,9,10,11中,数字 1 出现了 4次。
对于 100%的数据,1≤ n ≤ 1,000,000,0

好吧,碰到这种题目都要么简单模拟要么写神仙代码,我就暴力点吧
列出1到n的所有数,每个数的每一位数拆开来分别计数,判断是否是x
怎么拆开来一个数的每一位呢?可以这样
while(k){cnt[k%10]++;k/=10;}
这样cnt[n]表示n数字出现的次数了,外面再套一个for循环即可

其他的一些方法:
枚举:枚举个位/十位……最高位 是数字n的情况,相加 复杂度O(logn)
数位DP:太难了 目前还不会 以后慢慢学吧

数组

第一题 陶陶摘苹果 [0/1]
这个。。稍微会数组就能敲吧!
关于数组的定义和循环遍历,会用就ok
int arr[MAX]={0};
for(int i=0;i<strlen(arr);++i){ arr[i] 操作balabala ;}

第二题 校门外的树 [1/2]

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,…,L都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
共有M个区域,每个区域头SM 到尾 EM都没树

Sol 1 暴力染色
开一个数组 S[MAX];
每次for 循环,从区域头到区域尾 S[i]=1 表示树没了
最后for 循环,从0到L遍历,如果S[i]==0 表示这个位置还有树
或者反着思考,每次建区域如果这个位置还有树则砍掉一颗,都可

算法复杂度O(ML)

int L,M,ans;cin >> L >> M;ans=L+1;                     //注意端点问题for(int i=0;i<M;++i){int a,b;cin >> a >> b;for(int i=a;i<=b;++i){if(!vis[i]){          //这个位置还有树!vis[i]|=1;            //看似很X,其实相当于vis[i]=1ans--;              //树没了}}}cout << ans;

Sol 2 染色问题
类似于某些OJ的题目,从气球i涂颜色到气球j,M次,最后查询
我们用一个数组 R[i] 表示i被涂了多少次
如果从 从气球i涂颜色到气球j ,我们执行操作 R[i]++; R[j+1]–;
表示区间 i 以后多被涂一次,区间j+1 之后少被涂一次
相应就是区间[i,j]被涂了一次
然后用一个累加器s 这样for 一遍,每次s+=R[i]
我们就知道i位置被涂了多少次了

算法复杂度O(M+L)

int L,M;cin >> L >> M;for(int i=0;i<M;++i){int s,e;cin >> s >> e;R[s]+=1;R[e+1]-=1;}int now=0,ans=0;for(int i=0;i<=L;++i){now+=R[i];if(now==0)ans++;}cout << ans;

第三题 小鱼的数字游戏 [1/1]

反转数字数组,方法很多,这里讲四个简单的
Sol 1 基础for 一下
for (int i=n-1;i>=0;–i){//输出}

Sol 2 STL
利用STL reverse函数可以轻松做到反转数组
reverse(arr[],arr[]+strlen(arr));
然后 顺着for一下
for (int i=0;i<n;++i){//输出}

Sol 3 递归
利用递归函数输出即可,先搜索pos+1 再输出 arr[pos] ,注意加上终止条件
n 只要不是特别特别大,这个还是不会栈溢出的

int aa[]={1,2,3,4,5,6,7,8,9};
void rev(int n){if(n==9)return ;          //终止条件rev(n+1);                    //搜索下一位置cout << aa[n];                //输出当前位置
}
int main()
{rev(0);return 0;
}

Sol 4 堆栈
栈不就是FILO 先进后出的数据结构吗?利用一下就ok了

int aa[]={1,2,3,4,5,6,7,8,9};stack<int>S;for(int i=0;i<9;++i){S.push(aa[i]);}for(int i=0;i<9;++i){cout << S.top() << endl;S.pop();}

当然相信方法还有很多,就不一一列举了
第四题 小鱼比可爱 [0/1]
这题比较简单,暴力for一下其他小鱼是否比自己可爱即可

第五题 珠心算测验 [1/1]

他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

什,遇到一到普及-的题目就疯狂WA了!
就暴力O(N3)做吧

三层for循环,选取集合(用数组存储)中的下标i j k ,如果有两个下标相同那就继续选取吧 continue;
然后判断ans[i]==ans[j]+ans[k] 相等ans++;

当然,如果数组sort升序,复杂度可以稍微低一点,不过问题不大

注意:如果 7=1+6 7=3+4 那么7只能被算作一次!
如果有一个i 满足了ans[i]==ans[j]+ans[k] 的条件,直接跳到下一个i !

ll n,ans=0;cin >> n;for(int i=0;i<n;++i)cin >> aa[i];for(int i=0;i<n;++i){for(int j=0;j<n;++j){for(int k=0;k<n;++k){if(i==j || j==k || i==k)continue;if(aa[i]==aa[j]+aa[k]){ans++;j=n;k=n;     //本来用了goto,这样可以不用goto语句直接到下一个i}}}}cout << ans;

第六题 统计天数 [1/2]

经历千辛万苦,他收集了连续 N(1≤N≤10 6 ) 的最高气温数据。
现在,他想知道最高气温一直上升的最长连续天数。

DP ? nonono 这是连续上升子序列,不是上升子序列,没那么难啦
如果 tmp[i] > tmp[i-1] 表示连续上升天数+1
不然的话 不上升了,连续上升天数=1
for 一遍,答案就是连续上升天数的最大值

注意: 因为N比较大,怕用cin超时,这里用了scanf()函数,当然也可以用加速挂

int n,MA=0,cnt=0;scanf("%d",&n);for(int i=0;i<n;++i)scanf("%d",&aa[i]);for(int i=1;i<n;++i){if(aa[i]>aa[i-1])cnt++;else cnt=1;MA=max(cnt,MA);}printf("%d",MA);

写了这么多这么详细不给个赞或评论吗?
有错误欢迎讨论ww

【洛谷新手村解题报告二】C++语言,一题多解,思路和WA反思相关推荐

  1. 【洛谷新手村解题报告三 字符串/递归前】C++语言,一题多解,思路和WA反思

    [洛谷新手村解题报告三] 简单字符串 过程函数与递归 首先下一部分!字符串,这个前面两题新手跳过吧 简单字符串 第三题 统计单词数 [2/2] 给定一个单词,请你输出它在给定的文章中出现的次数和第一次 ...

  2. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...

  3. python刷题 NOI题库 python题解 洛谷、牛客网、AcWing 刷题等

    NOI题库 python题解-2022.01.07整理(1.1-1.3) NOI题库 python题解-2022.01.07整理(1.1-1.3)_dllglvzhenfeng的博客-CSDN博客 N ...

  4. c语言写程序思路考研题,快速解题 | 在考场C语言编程题

    原标题:快速解题 | 在考场C语言编程题 对于考<C语言程序设计>的小伙伴们来说,程序设计题是很多同学觉得相对较难的一个版块.其题目虽然不算多,但在考研150分的试卷中,却占据了较大的比重 ...

  5. c语言倒序输出单词_洛谷 || 单词覆盖还原(C语言)

    点击上方「蓝字」关注"程序员Bob" 每天与你不见不散! 每日一句,送给最珍贵的你: 诱人的机会总是转瞬即逝的.真正好的投资机会不会经常有,也不会持续很长的时间,所以你必须做好行动 ...

  6. 【洛谷】【动态规划/二维背包】P1855 榨取kkksc03

    [题目描述:] ... (宣传luogu2的内容被自动省略) 洛谷的运营组决定,如果...,那么他可以浪费掉kkksc03的一些时间的同时消耗掉kkksc03的一些金钱以满足自己的一个愿望. Kkks ...

  7. [精品]CSAPP Bomb Lab 解题报告(二)

    接上篇[精品]CSAPP Bomb Lab 解题报告(一) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  8. 【洛谷5284】[十二省联考2019] 字符串问题(后缀树优化建边)

    题目: 洛谷 5284 分析: 首先不要问我标题里的「后缀树」是什么,我也不会,瞎写的 -- (传说就是反串后缀自动机的 fa 树?) 前置技能:[知识总结]后缀自动机的构建 首先有一个很 naive ...

  9. 2021.11.17洛谷小鱼游泳进阶版——c语言

    题目背景 原来的题目太简单,现改进让小鱼周末也休息,请已经做过重做该题. 题目描述 有一只小鱼,它平日每天游泳 250 公里,周末休息(实行双休日),假设从周 x(1\le x \le 7)x(1≤x ...

最新文章

  1. (亲测可行)ubuntu16.04+Opencv3.4.3+opencv_contrib3.4.3安装编译全过程
  2. 区块链,使用 Go-Ethereum 搭建以太坊私有链
  3. ActiveMQ的介绍及使用实例.
  4. int 小数_[LeetCode] 166. 分数到小数
  5. 优化 .NET Core logging 中的泛型 logger
  6. iOS应用国际化教程(2014版)
  7. java判断线程是否wait_Java并发编程之线程间通讯(上)wait/notify机制
  8. 软件设计原则:内聚、耦合有哪几种类型?内聚度、耦合度如何比较?
  9. 关于批量插入数据之我见(100万级别的数据,mysql)
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的学生社团管理系统
  11. Node.js 开发模式(设计模式)
  12. 2014牡丹江——Hierarchical Notation
  13. pxe装机原理_pxe网络安装操作系统 原理与详细过程
  14. 在我笔记本Ubuntu上装普罗米修斯记录
  15. win7声音小图标不见了,如何修复
  16. 简单逆向10(z3-solver)
  17. HLG 火影忍者之~静音
  18. 学习前端的第三十二天——ES6
  19. 申请 NVIDIA vGPU 90天试用 LICENSE
  20. 谷歌账户暂停三个月重新启用,谷歌账户暂停三个月重新启用,转化目标是否有效?

热门文章

  1. java抓包asp_asp 之上传漏洞终结篇
  2. 将时谐电磁场引入工程电磁场的意义_工程电磁场教案-国家精品课华北电力学院崔翔-第4章(倪光正主编教材)...
  3. 管理运筹学软件计算机解咋看,第3章 线性规划问题的计算机求解_中国地质大学(武汉):管理运筹学(郭海湘)_ppt_大学课件预览_高等教育资讯网...
  4. 华尔街借助软件甄别忠诚员工
  5. 基于PLECS的有源电力滤波器APF仿真
  6. 计算机中的位运算—正数,负数,原码,反码,补码
  7. php闪字生成,在线闪字
  8. 微信5.0 Android版飞机大战破解无敌模式手记
  9. 搞不懂SDN?那是因为你没看这个小故事…
  10. 手把手教你用Python网络爬虫实现上海证券交易所定期报告pdf文件下载(附代码)...