2018年,牛客网小白月赛5

第一次啊,补题,希望大佬批评。

题目按我补题顺序来的。

https://www.nowcoder.com/acm/contest/135#question

H  题

最大公倍数

题意:给出两个数,求最大公倍数

欧几里德算法算出最大公约数k;

然后算出。最大公倍数即可

代码如下:

#include<iostream>
#define ll long long
using namespace std;
ll gcd(ll a, ll b)
{
 return b == 0 ? a: gcd(b, a%b);
}
int main()
{
 ll n, m;
 cin >> n >> m;
 ll kk = gcd(n, m);
 cout << (n / kk)*(m / kk)*kk << endl;
 return 0;
}

 

J 题  time 

题意:

给出一个时间,比如23:32,得出不是它本生的上一个和下一个回文时间,(回文时间指的是:ab:ba这种格式)

思路一:

模拟:直接一分一分的减去,得到下一个回文时间,一分一分的加得到上一个时间。不过,要仔细些不然会在这里出错。                          然后,写一个回文的判断就可以了。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
 int a, b,h,m;
 scanf("%d:%d", &a, &b);
 //上一个时刻
 h = a; m = b-1;
 while (1)
 {
  if (h == ((m % 10) * 10 + m / 10))
  {
   cout << h << ":" << m<<endl;
   break;
  }
  m--;
  if (m < 0)
  {
   m += 60; h--; if (h < 0)h += 24;
  }
 }
 h = a; m = b+1;
 while (1)
 {
  if (h == ((m % 10) * 10 + m / 10))
  {
   cout << h << ":" << m<<endl;
   break;
  }
  m++;
  if (m >= 60)
  {
   m -= 60; h++; if (h >= 24)h -= 24;
  }
 }
}

思路二:

打表

因为:回文时钟的种数只有16种(注意:06:60不符合)所以可以建一个结构体存下小时h和分m和总的分h*60+m;注意一下0:0是24*60所以注意一下就可以了,直接把所给的时间在这个数组中找一下第一个比它大的就行(注意:0:0)

代码略

 

I  题

题意:

给你一个数组存入数字,然后又n次操作,每次对 l 到 r 区域进行每个数字加或减去d。然后,输出x到y区域的所有数字之和。

思路:

例子:

建一个数组记录操作数sum[ ]只操作一次:从4到6加7,则sum[4] + =7;sum[6+1] - =7;  然后就for (int i = 1; i <= n; i++)    sum[i] += sum[i - 1];  是不是在4到6之间,sum都是7了

如果是4到6减去7, 则sum[4] - = -7;sum[6+1] + =7;然后就for (int i = 1; i <= n; i++)    sum[i] += sum[i - 1];  是不是在4到6之间,sum都是  -7 了.

那么多组操作呢?

先把这段代码放上来;

while (m--)
 {
  scanf("%d%d%d%d", &a, &b, &c, &d);
  if (a == 0) sum[b] += d, sum[c + 1] -= d;
  else sum[b] -= d, sum[c + 1] += d;
 }
 for (int i = 1; i <= n; i++)
  sum[i] += sum[i - 1];

是不是担心,这样会出错。其实不用的。刚刚一次操作是  sum[4] + =7;sum[6+1] - =7或则  sum[4] - = -7;sum[6+1] + =7  多组操作会影响每一组操作的独立性吗? 答案是不会。你可以把它看做是这样的代码;

for (int i = 0; i < t; i++)
{
 scanf("%d%d%d%d", &a, &b, &c, &d);
 if (a == 0) sum[i][b] += d, sum[i][c + 1] -= d;
 else sum[i][b] -= d, sum[i][c + 1] += d;
 for (int j = 1; j <= n; j++)
  sum[i][j] += sum[i][j - 1];
}
for (int i = 1; j <= n;j++)
for (int j = 0; j < t; j++)
{
 num[j] += sum[j][i];
}

但是,每一次的操作是独立的(相当于数学中数据等价一样),所以,就把多组操作一起处理了。

代码如下:

 

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll num[1000004], sum[1000004];

ll ans = 0;
int main()
{
 int n, m, a,b,c,d, x,y;
 scanf("%d%d", &n, &m);
 for (int i = 1; i <= n; i++)
  scanf("%lld", &num[i]);
 while (m--)
 {
  scanf("%d%d%d%d", &a, &b, &c, &d);
  if (a == 0) sum[b] += d, sum[c + 1] -= d;
  else sum[b] -= d, sum[c + 1] += d;
 }
 for (int i = 1; i <= n; i++)
  sum[i] += sum[i - 1];
 scanf("%d%d", &x, &y);
 for (int i = x; i <= y; i++)
  ans += sum[i]+num[i];
 cout << ans << endl;
}

 

 

F  题

这个题让我想起了各种切割(数学)

总结一下:

n条直线最多分平面问题

n(n+1)/2+1;

折线分平面

2*n^2-n+1;

封闭曲线分平面

n^2-n+2;

平面分割空间

(n^3+5n)/6+1;

N个三角形分割平面

3*n^2-3*n+2

在一个圆上有n个点,将n个点两两相连分割圆

1 + n*(n - 1) / 2 + n*(n - 1)*(n - 2)*(n - 3) / 24

具体证明就不说了,(线段和射线决定对应一个区域(特别的复杂的都是递推了))

题意:就不用说了

思路:直接套数学公式

代码如下:

#include<iostream>
#define ll long long
using namespace std;
int main()
{
 ll n;
 while (cin >> n)
 {
  cout << 1 + n*(n - 1) / 2 + n*(n - 1)*(n - 2)*(n - 3) / 24 << endl;
 }
 return 0;
}

 

A  题      无关

题意:给你一个集合,集合中元素都是素数(其实只要两两互质就行),问你在一个从  l 到 r 范围中,有几个数不被集合中的任何一个元素整除,(不是,他们的倍数).

思路:

找到他们倍数的个数n就可以了,(正难则反(高中))则答案为 (r-l+1)-n;

那么,直接变成在 1到 l和1 到 r的个数,再相减,就是最后答案了。

额,如何找1  到 L 的个数呢?

L/a就等于a在1到L的倍数的个数了

那么怎么找既是a又是b的倍数呢?直接 L/(a*b);注意:L/(a*b)=>L/a / b;也就是说,可以在不同时刻来除,不影响结果的。

这样就可以找集合中各个元素的倍数个数n1, 两个元素乘积的倍数n2, 三个......n3,  四个,,,,,n4

然后用概率论中的概率公式  s=f(a)+f(b)+f(c)+......(-1)^(n-1)(f(n));(随机时间概率公式,我打了大概的样子)

中间:因为肯定要用到集合所形成的子集的枚举:怎么枚举呢?

比如:假如有3个元素{a,b,c}那么有八个子集(子集个数公式2^n, 非空子集和真子集公式2^n-1,非空真子集2^n-2):

{},{a}, {b}, {c},{a,b},{a,c}, {b,c}, {a,b,c};  元素个数为3

000  {}

001  {  ,  ,a}

010  {  ,b,  }

100  {c,  ,   }

011  {  ,b  ,a}

101  ......

110  ......

111  {c,  b,  a}

这样不就可以表示成 0——7, 

好了,

代码是怎样,不多说

f  用来表示(-1)^(n-1)

1<<n(n是元素个数)表示子集个数,怎样把每个子集表示一遍。

for (ll i = 1; i < (1 << n); i++)
 {
  temp = m; f = -1;
  for (int j = 0; j < n; j++)
  {
   if ((i >> j) & 1==1)
   {
    temp /= a[j];
    f *= -1;
   }
  }
  res += temp*f;
 }

 

总的代码如下:

#include<iostream>
#include<stdio.h>
#define ll long long
using namespace std;
ll a[105];
ll l, r, n;
ll ans(ll m)
{
 ll res = 0;
 ll f, temp;
 for (ll i = 1; i < (1 << n); i++)
 {
  temp = m; f = -1;
  for (int j = 0; j < n; j++)
  {
   if ((i >> j) & 1==1)
   {
    temp /= a[j];
    f *= -1;
   }
  }
  res += temp*f;
 }
 return m-res;
}
int main()
{
 scanf("%lld%lld%lld", &l, &r, &n);
 for (int i = 0; i < n; i++)
 scanf("%lld", &a[i]);
 ll res = ans(r) - ans(l-1);
 printf("%lld\n", res);
}

专门讲集合子集的博客

https://blog.csdn.net/yzl20092856/article/details/39995085

 

D 题

这不是我重点的题目:

注意一下优化就可以了,本质是用到  一个阶乘中有几个5,有多少个5就有多少个0

代码如下:

#include<iostream>
using namespace std;

long long f(long long n){
 long long sum = 0;
 while (n){
  sum += n / 5;
  n /= 5;
 }
 return sum;
}
int main(){
 long long n;
 long long sum = 0;
 cin >> n;
 for (int i = 5; i <= n; i++){
  if (i + 5 <= n){
   sum += 5 * f(i);
   i += 4;
  }
  else{
   sum += f(i)*(n - i + 1);
   i = n;
  }
 }
 cout << sum;
 return 0;
}

 

emmmmm,这道题,有点神,读题。大佬读题都是说小鱼吃大鱼,维护了平衡。我读的是坐一天月子不吃东西。。。反正,都是看代码猜题意:

也就是,每过2天,有一天不能吃东西

就是n-n/3;

代码如下:

#include<stdio.h>
#define ll long long
int main()
{
 ll n;
 while (scanf("%lld", &n)!=EOF)
 {
  printf("%lld\n", n - n / 3);
 }
}

 

转载于:https://www.cnblogs.com/ALINGMAOMAO/p/9362677.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

292. Nim 游戏

292. Nim 游戏 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。你们轮流进行自己的回合&#xff0c;你作为先手。每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函…

0710 mux协议的作用(ppp拨号时如何和gprs进行at指令交互)

ppp拨号使gprs上网的同时如何和gprs模块进行at指令的交互&#xff0c;这是一个问题。 在linux中&#xff0c;ppp拨号上网是内核中支持的&#xff0c;只需要在内核配置中选上。 ppp拨号的方式使gprs进行上网与at指令使gprs上网&#xff0c;两者之间有不同。ppp是一个将用at指令使…

爬虫笔记(十二)——浏览器伪装技术

为什么要进行浏览器伪装技术&#xff1f; 有一些网站为了避免爬虫的恶意访问&#xff0c;会设置一些反爬虫机制&#xff0c;对方服务器会对爬虫进行屏蔽。常见的饭爬虫机制主要有下面几个&#xff1a; 1. 通过分析用户请求的Headers信息进行反爬虫 2. 通过检测用户行为进行反…

650. 只有两个键的键盘

650. 只有两个键的键盘 最初记事本上只有一个字符 ‘A’ 。你每次可以对这个记事本进行两种操作&#xff1a; Copy All&#xff08;复制全部&#xff09;&#xff1a;复制这个记事本中的所有字符&#xff08;不允许仅复制部分字符&#xff09;。Paste&#xff08;粘贴&#x…

Codeforces 626F Group Projects (DP)

题目链接 8VC Venture Cup 2016 - Elimination Round 题意 把$n$个物品分成若干组&#xff0c;每个组的代价为组内价值的极差&#xff0c;求所有组的代价之和不超过$k$的方案数。 考虑DP&#xff0c;$f[i][j][k]$表示考虑到第$i$个物品的时候&#xff0c;还有$j$组尚未分配完…

《活出生命的意义》:人生有何意义?

在你一生的阅读体验中&#xff0c;如果能够有一本书&#xff0c;它的某个章节、某种思想、或者某句话能够触动你的内心&#xff0c;解决你的困惑&#xff0c;甚至能改变你的命运&#xff0c;那这样的一本书你一定要视如珍宝&#xff0c;经常翻阅&#xff0c;维克多弗兰克尔的《…

右键添加git-bash

主要&#xff1a; 右键如果没有git-bash&#xff0c;如何给右键手动添加 前面对右键存在git-bash但使用出现问题的解决&#xff0c;也想到如果右键都没有&#xff0c;该如何给右键添加了&#xff0c;于是接着记录下如何添加的过程&#xff1a; 情形&#xff1a; 手动给右键添加…

Weblogic的缓存

2019独角兽企业重金招聘Python工程师标准>>> 最近遇到一个关于weblogic缓存的问题。再把war包放入到weblogic指定目录启动以后&#xff0c;访问页面信息没有更新。最后发现是\weblogic\user_projects\domains\base_domain\servers\AdminServer下的文件没有清除&…

725. 分隔链表

725. 分隔链表 给你一个头结点为 head 的单链表和一个整数 k &#xff0c;请你设计一个算法将链表分隔为 k 个连续的部分。 每部分的长度应该尽可能的相等&#xff1a;任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。 这 k 个部分应该按照在链表中出现的顺…

LAMP介绍-MySQL安装

2019独角兽企业重金招聘Python工程师标准>>> LAMP: linux-apache-mysql-php &#xff08;安装方式有&#xff1a;rpm&#xff0c;源码&#xff0c;二进制免编译&#xff09; linux-操作系统 apache-web服务软件&#xff08;httpd&#xff09; mysql-存储数据库 php…

总结verilog产生随机数的$random和seed

$random(seed)是verilog中最简单的产生随机数的系统函数。 在调用系统函数$random(seed)时&#xff0c;可以写成三种样式&#xff1a;1&#xff09;$random&#xff0c;2&#xff09;$random()&#xff0c;3&#xff09;$random(seed)。下面分别说明&#xff1a; 1&#xff09;…

326. 3的幂

326. 3的幂 给定一个整数&#xff0c;写一个函数来判断它是否是 3 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 3 的幂次方需满足&#xff1a;存在整数 x 使得 n 3x 示例 1&#xff1a;输入&#xff1a;n 27 输出&#x…

Lottie 站在巨人的肩膀上实现 Android 酷炫动画效果

说到动画效果&#xff0c;一般都会感到很高端&#xff0c;感觉很酷炫&#xff1b;而小菜技术有限&#xff0c;稍复杂的动画效果也需要很多时间处理&#xff0c;但是遇到时间紧任务重的情况该怎么办呢&#xff1f;那就尝试一下 Lottie 吧&#xff0c;酷炫的动画集成却相当简单&a…

正则表达式(读书过程所记未整理)

\d 表示一位数字字符 \d{3} 表示3个数字字符 匹配电话比如400-400-1118 import re phone_number re.compile(r\d{3}-\d{3}-\d{4}) mo phone_number.search(rfor a number is 400-400-4000) print(mo.group()) ************************************************************…

java1

不知道为啥粘贴的图片是一堆编码。。。。 如何插入图片 博客后后台MarkDown编辑器上只有一个按钮&#xff0c;就是用来上传图片并自动插入MarkDown标记的&#xff0c;超级好用 &#xff08;一&#xff09;学习总结 1.在java中通过Scanner类完成控制台的输入&#xff0c;查阅JDK…

430. 扁平化多级双向链表

430. 扁平化多级双向链表 多级双向链表中&#xff0c;除了指向下一个节点和前一个节点指针之外&#xff0c;它还有一个子链表指针&#xff0c;可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项&#xff0c;依此类推&#xff0c;生成多级数据结构&#xff0c…

PHPstudy搭建本地环境的网页加载速度慢的解决方案

PHP5.3以上&#xff0c;如果数据库链接地址是localhost&#xff0c;会自动检测最终的地址是IPV4还是IPV6&#xff0c;所以会比较慢。解决办法&#xff1a;修改数据库的链接地址&#xff0c;将localhost改为127.0.0.1即可。 原文链接&#xff1a;https://chasjd.com/posts/fb433…

标记偏见_分析师的偏见

标记偏见“Beware of the HiPPO in the room” — The risks and dangers of top-down, intuition-based decision making are well known in the business world. Experimentation and data-based decision making become widely acknowledged as the right way to steer a bu…

scott登录查询常用语句

一、简单查询 1.简单查询select * from emp;--查询表emp中的所有数据select empno as id,ename as name from emp;--查询表emp中的empno显示为id&#xff0c;ename显示为name 2.去除重复select distinct job from emp;--将表emp中的job去重select distinct job,deptno from emp…

CSS结构的基础认知

css的属性值与html的属性值用法不相上下&#xff0c;但是css主要分为内联样式表和外联样式表。 内联样式表用法&#xff1a;在html文件中的《head》头文件中添加<style></style>标签&#xff0c;在标签内添加所需的属性值&#xff0c;例如&#xff1a;<!DOCTYPE…