2020 乐山师范学院新生程序设计大赛题解

A 数组求和

中等难度

题目大意:

给定一个数组,执行若干次操作,每次操作可以把两个相邻的数变成相反数,求数组最大的和。

解题思路:

这其实是一个思维题,认真思考会发现,最大和,肯定希望数组中的负数是最小的,最好全都是非负数。基于这个思想,会发现,经过若干次操作后,可以让负数的位置自由移动。例如 n = 5 , − 5 , 4 , 3 , 2 , 1 n = 5, {-5, 4, 3, 2, 1} n=5,−5,4,3,2,1,第一次移动选择下标 1,结果就会变成 5 , − 4 , 3 , 2 , 1 {5, -4, 3, 2, 1} 5,−4,3,2,1,会发现,负数的位置向移动了一,不难发现,在经过 3 3 3 次操作后,数组就会变为 5 , 4 , 3 , 2 , − 1 {5, 4, 3, 2, -1} 5,4,3,2,−1,此时,数组和就是最大的。

所以这题的做法就很明显了:

统计负数的个数:

  • 如果是偶数个,就可以全部转换成正整数,因为可以任意移动,就移动成俩俩一对,最后再翻转过来,所以全都会变成正数。

  • 如果是奇数,那必然只会有一个负数,就让绝对值最小的数变成负数即可。

最后求和判断下即可:

代码:

#include <iostream>
#include <math.h>
using namespace std;const int maxn = 1e5 + 5;int main()
{int n;int sum = 0; // 最后的答案和int mi = 10000; // 记录绝对值最小的int cnt = 0; // 负数的个数cin >> n;for(int i = 0; i < n; ++i) {int a; cin >> a;sum += abs(a); // 直接加上绝对值if(abs(a) < mi)mi = abs(a);if(a < 0)++cnt;}if(cnt % 2 == 1) sum -= 2 * mi; // 如果是奇数个,因为之前加了一个,所以要减去两倍cout << sum << endl;return 0;
}

B 超级短的题

困难?反正我是感觉挺困难的。

题目大意:

给定一个数字 n n n,求 n ! n! n! 的最右边有多少个连续的 0 0 0 。

解题思路:

这有点数学题的味道,要先想清楚数字最右边的 0 0 0 是怎么来,其实就是 10 10 10 的倍数, 100 100 100 的倍数,以此类推。也就是说一个数有几个因子是 10 10 10,最右边就有几个 0 0 0。所以这题就转换成怎么求 10 10 10 这个因子的个数。

10 10 10 分解下质因子就是 2 2 2 和 5 5 5 ,也就是找 n ! n! n! 因子里有几个 2 2 2 和 5 5 5,然后取最小值即可。

这就是一个数学公式:

f ( n ) = ∑ i = 1 ∞ n p i f(n) = \displaystyle\sum_{i=1}^{\infty}\cfrac{n}{p^i} f(n)=i=1∑∞​pin​

其实是求 p p p 的倍数有几个, p 2 p^2 p2 的倍数有几个 . . . ... ... 最后累加就是答案

照着这个公式写代码即可

其实只用求因子 5 5 5 的个数,因为 5 5 5 的个数是远远小于 2 2 2 的个数.

代码:

#include <iostream>
#include <math.h>
using namespace std;const int maxn = 1e5 + 5;int main()
{int n;cin >> n;int ans = 0;for(int i = 5; i <= n; i *= 5)ans += n / i;cout << ans << endl;return 0;
}

题目短,代码也短 _

C 时光倒流

签到题

题目大意:

给一个 BO5 的比分,看谁能赢。

解题思路:

一个 if 就搞定了

代码:

#include <iostream>
#include <math.h>
using namespace std;const int maxn = 1e5 + 5;int main()
{int n, m;cin >> n >> m;if(n == 3) cout << "DWG win!\n";else cout << "SN win!\n";return 0;
}

D 这好像是一道签到题?

困难。杨会自己出的一道题,和 B 题其实是一样的,代码很短,思路有点难

题目大意:

最小化操作次数,使得数组符合题目公式的要求
f ( l , r ) = ∑ i = l r a i − ∑ i = l r i f(l,r)=\sum^{r}_{i=l}{a_i}-\sum^{r}_{i=l}{i} f(l,r)=i=l∑r​ai​−i=l∑r​i
任意的 f ( l , r ) f(l, r) f(l,r) 都是 r − l + 1 r-l+1 r−l+1 的倍数

解题思路:

这是一个构造体。因为要求数组和最小, 所以 $f(l, r) = r - l +1 $ , 这一步一定要理解,只要这样,才是倍数关系,并且是最小的。再观察这个上面的公式,结合刚才结论,当所有的 a i = i + 1 a_i = i+1 ai​=i+1 时,就是符合条件的,因为一一对应相减,贡献就是 1,有几个数就有几个1,就会刚好满足条件。

所以最终构造的数组其实就是 [ 2 , 3 , 4 , . . . , n , n + 1 ] [2, 3, 4, ..., n, n+1] [2,3,4,...,n,n+1],那最后的问题其实就是最少要多少次,才能把原来的数组构建成目标数组。

这涉及到贪心策略,大致思路就是直接把当前数字减到目标数字,或者减到前一个数字,次数取小累加即可。为什么可以这样,首先最多就是直接减到目标数字,这是肯定可以的,或者减到和前面一样,这样前面减的时候可以一起减,所以后面的就不用算。两个取最小的即可。

代码:

#include <iostream>
#include <algorithm>
using namespace std;const int maxn = 1e6 + 5;long long a[maxn];int main()
{int n;long long sum = 0;cin >> n;a[0] = 1;for(int i = 1; i <= n; ++i) {cin >> a[i];// min 和 max 都是 C++ 的函数,传递两个参数,返回最小或者最大值,使用的话要导入头文件algorithmsum += min(a[i]-i-1, max(0LL, a[i]-a[i-1]));}cout << sum << endl;return 0;
}

E 追女孩

签到-简单难度 (这个方法可以尝试下_

题目大意:

给出你和女孩的坐标以及各自的速度,问你能不能追上女生,被追不算

一个坑点就是 当两人的位置相等时,也是算追上的。

解题思路:

又是一个 if 即可搞定,

代码:

#include <iostream>
using namespace std;int main()
{int x, y;int n, m;cin >> x >> y;cin >> n >> m;if(x == y || (x < y && n > m))cout << "Yes\n";elsecout << "No\n";return 0;
}

F 我怎么会不知道学校的域名?

中等+难度

题目大意:

在给定字符串中,找到符合 l s n u a c m lsnuacm lsnuacm

解题思路:

一般来讲,设计到字符串的题目,难度都会高一点,其实实现起来并不难,就是根据题目的规则模拟匹配即可,可以看代码。

代码:

#include <iostream>
#include <string.h>
using namespace std;const int maxn = 1e6 + 5;char s[maxn];
char t[] = "lsnuacm";int main()
{cin >> s;int n = strlen(s); // 字符串s的长度int m = strlen(t); // 题目要求 t 的长度// 标志变量, 0表示已经匹配了0个,1表示已经匹配了1个,以此类推int flag = 0;// 答案int cnt = 0;for(int i = 0; i < n; ++i) {// 找 s[i] 是在 t 中的第几个int j;for(j = 0; j < m; ++j)if(t[j] == s[i])break;// 如果是开头就是把flag设置为1if(j == 0) flag = 1;else if(j >= m) continue; // 如果不是t中的字符,根据题目规则,需要跳过else if(j == flag) // 如果刚好找的是下一个,匹配数就加一++flag;else flag = 0; // 否则就重置为0if(flag == m) { // 如果已经匹配了m个字符,就表明已经出现了一个,答案加一,并把标志位清空flag = 0;++cnt;}}cout << cnt << endl;return 0;
}

G 我爱画沙漏

简单+难度

题目大意:

我觉的大家都能看懂

解题思路:

非常经典的一个画图题,一般分两次画,一次画倒三角,一次画正三角

代码:

#include <iostream>
using namespace std;int main()
{int n;cin >> n;int d = n / 2;// 倒三角for(int i = 0; i <= d; ++i) {for(int j = 0; j < i; ++j)cout << " ";for(int j = 0; j < n-i*2; ++j)cout << "*";cout << endl;}// 正三角for(int i = 1; i <= d; ++i) {for(int j = 0; j < d-i; ++j)cout << " ";for(int j = 0; j < i*2+1; ++j)cout << "*";cout << endl;}return 0;
}

H 找出所有的重复数字

中等+难度

题目大意:

找出数组中重复的数字,如果没有或者有负数输出 − 1 -1 −1

解题思路:

这题需要一个技巧,计数技巧,即用数组来统计数字出现的次数。具体看代码

代码:

#include <iostream>
using namespace std;const int maxn = 1e6 + 5;
int cnt[maxn];
int a[maxn];int main()
{int n;int flag = 1;cin >> n;for(int i = 0; i < n; ++i) {cin >> a[i];if(a[i] < 0) flag = 0;else ++cnt[a[i]]; // 用数字做下标}if(!flag) {   // 出现负数的情况cout << -1 << endl;return 0;}flag = 0;for(int i = 0; i < n; ++i) {if(cnt[i] > 1) {flag = 1; // 说明有重复的数字cout << i << " ";}}if(flag) cout << endl;else cout << -1 << endl;return 0;
}

I 小学二年级的数学问题

中等难度

题目大意:

就是分数字, 两边的个数要一样,要求差值最小,也就是尽可能均分

解题思路:

这是 2 的幂次形式,所以有 2 1 + 2 2 + 2 3 + . . . + 2 n − 1 < 2 n 2^1+2^2+2^3+...+2^{n-1} < 2^n 21+22+23+...+2n−1<2n

其实很容易想到,选一个最大的,剩下的全选最小的,差值就是最小的

代码:

#include <iostream>
using namespace std;int main()
{int n;cin >> n;int ans = 1 << n; // 左移一位就是乘2,移n位就是乘n个2int i;for(i = 1; i < n/2; ++i)ans += 1 << i;for(; i < n; ++i)ans -= 1 << i;cout << ans << endl;return 0;
}

J 她生气了

简单难度 (get新知识_,蔡队就是这样哄女朋友的)

题目大意:

你女朋友现在生气,说一个词女朋友的生气值就会少些,要说多少个词

解题思路:

就是做一个除法就可以了,余下的也要在说一个

代码:

#include <iostream>
using namespace std;int main()
{int n, m;cin >> n >> m;int ans = n / m;if(n % m) ++ans;cout << ans << endl;return 0;
}

2020 乐山师范学院新生程序设计大赛题解相关推荐

  1. 2020安徽省大学生程序设计大赛题解——E 收集圣物

    2020安徽省大学生程序设计大赛题解--E 收集圣物 E 收集圣物 在一个策略游戏中,僧侣单位可以收集圣物,放入修道院中,以生产黄金.因此,圣物对赢得游戏的胜利很重要. 某个僧侣正处于一个长为n 宽为 ...

  2. 2020安徽省大学生程序设计大赛题解——A数字排列

    2020安徽省大学生程序设计大赛题解--A数字排列 A 数字排列 给出两个整数A 和 B,可以重新排列A 得到新的数字C(不能有前导0).求在小于等于B的情况下,C的最大值是多少.如果不存在输出-1. ...

  3. 2020安徽省大学生程序设计大赛题解——K 农夫打狼

    2020安徽省大学生程序设计大赛题解--K 农夫打狼 K 农夫打狼 题解 标签 排序,动态规划 分析 图K−1本题的一个样例,彩色十字为起点和终点图K-1 \ \ \ \ 本题的一个样例,彩色十字为起 ...

  4. 2020安徽省大学生程序设计大赛题解——F 跳蛙出行

    2020安徽省大学生程序设计大赛题解--F 跳蛙出行 F 跳蛙出行 池塘里有n片荷叶排成一行,有一只青蛙在上面跳跃.但是,这只青蛙是只不同寻常的青蛙,它每跳一次,只能从一片荷叶跳到相邻的荷叶上,并且, ...

  5. 2020安徽省大学生程序设计大赛题解——J 飞奔的战士

    2020安徽省大学生程序设计大赛题解--J 飞奔的战士 J 飞奔的战士 题目 众所周知, T e u t o n i c K n i g h t Teutonic Knight TeutonicKni ...

  6. 排列组合 南阳理工学院第三届省内高校新生程序设计大赛(决赛)A. 湮灭残昼

    南阳理工学院第三届省内高校新生程序设计大赛(决赛) Problem A. 湮灭残昼 时间限制 1 s 内存限制 256 MB 当阳光拥抱过花朵,光便携带了花香. 晚风掠过人群,风就能学会低吟. 影子在 ...

  7. 第八届Nuist程序设计大赛 题解

    第八届Nuist程序设计大赛 A: 当然是选择AC它了! 题目描述: 听闻第八届程序设计大赛马上就要开始了, 已经报名的童鞋们都纷纷去OJ刷题. 但你的女朋友(tan90°)想知道她写的"A ...

  8. 金莹江苏省计算机学会教授,2020年江苏省大学生程序设计大赛在我校举办

    11月15日,2020年江苏省程序设计大赛在河海大学举办.河海大学副校长董增川教授.江苏省计算机学会秘书长金莹教授出席闭幕式并致辞. 河海大学副校长董增川教授在致辞中表示,河海大学不断深化教育教学改革 ...

  9. 2018年安徽省程序设计大赛题解

    2018年安徽省程序设计大赛参考题解 水平有限错误难免. A: 数7 时间限制:1 s 题目描述: ​ 求整数序列A 中位置L 到R中间一共有多少个7,(每一个位上的7和能被7整除的次数) 输入 第一 ...

最新文章

  1. ValueError: Variable rnn/basic_lstm_cell/kernel already exists, disallowed.
  2. php 数组导出csv_php导出CSV抽象类实例
  3. Automatic Diagnostic Repository Command-Interpreter
  4. ubuntu 12.10 笔记
  5. python 操作RabbitMQ
  6. Docker 官方公共仓库 Docker Hub 遭攻击,恐19 万用户信息泄露;Intel 10核心新品要现身了?...
  7. http请求requestUtils
  8. 神经网络技巧篇之寻找最优参数的方法
  9. 【java线程系列】java线程系列之java线程池详解
  10. [转]Ubuntu下快速安装python
  11. 中国高性能计算服务器排名,2007中国高性能计算100强出炉
  12. java 日期计算类_日期类的加减及java中所以日期类的操作算法大全
  13. SpringMVC实现ajax上传图片实时预览
  14. 零起点学习Linux系列培训视频-寒冰作品
  15. ICCV 2021可逆的跨空间映射实现多样化的图像风格传输:Diverse Image Style Transfer via Invertible Cross-Space Mapping
  16. linux md5sum 文件夹,每天一个 Linux 命令(63):cksum、md5sum、sha1sum命令
  17. MyBatis缓存介绍
  18. “crol/cror”函数实现流水灯
  19. Apple’s Secret? It Tells Us What We Should Love
  20. 冰冻三尺非一日之寒之产品观

热门文章

  1. CSS代码缩写,占用更少的带宽/字体缩写/盒模型代码简写/颜色值缩写
  2. 百度浏览器的编程html,百度来路浏览器劫持代码(替换浏览器正在浏览页面)...
  3. Cannot get a STRING value from a NUMERIC cell最新解决方法
  4. 工作疑问之windows EFS加密后重装系统
  5. w10系统服务器如何创建新用户,关于Win10怎么给本地账户添加管理员权限的讲解...
  6. ev1百家云视频解密工具、ev1视频提取工具,支持Windows、MacOS、Linux
  7. Java原始数据类型
  8. HTML5笔记(一)
  9. keplergl,一款超炫的地理数据可视化神器!
  10. git fatal: The remote end hung up unexpectedly 错误