洛阳师范学院 ACM实验室 中秋娱乐赛“月饼代码大逃杀”题解

news/2024/9/19 7:57:53/文章来源:https://www.cnblogs.com/lyx9785/p/18417735

题解包括C和C++两种语言_

壹 我要洋人死!

1、直接输出即可

C语言题解:

#include <stdio.h>
int main (){printf("woyaoyangrensi!");return 0;
}

C++语言题解:

#include<iostream>
using namespace std;
int main(){printf("woyaoyangrensi!");return 0;
}

贰 学长的馈赠

1、注意转义字符,直接输出即可

C语言题解:

#include <stdio.h>
int main (){printf("printf(\"Hello, World!\");");return 0;
}

C++题解:

#include<iostream>
using namespace std;
int main(){cout << "printf(\"Hello, World!\");";return 0;
}

叁 A+B AGAIN?

1、因为有t个测试用例,所以我们用循环解决

2、在每次循环中用除法和取模分别取出个位和十位,将其相加,输出结果

C语言题解:

#include <stdio.h>
int main (){//读入tint t; scanf("%d", &t);for(int i = 1; i <= t; ++i){//读入数字int num; scanf("%d",&num);//计算十位上的数字int TenBits = num / 10;//计算个位上的数字int Bits = num % 10;printf("%d\n",TenBits + Bits);}return 0;
}

C++题解:

#include <bits/stdc++.h>
using namespace std;
int main ()
{//读入tint t; cin >> t;for (int i = 1; i <= t; ++i){//读入数字int num; cin >> num;//计算十位上的数字int TenBits = num / 10;//计算个位上的数字int Bits = num % 10;//输出二者相加的结果cout << TenBits + Bits << endl;}return 0;
}

肆 鸡兔同笼,但是兔兔太可爱了,换成小马!

小学就学过的“鸡兔同笼”问题,忘记的可以自行搜索一下

C语言题解:

#include <stdio.h>int main() {int n, m;// 输入动物总数和腿的总数scanf("%d %d", &n, &m);// 判断腿数是否为偶数if (m % 2 != 0) {printf("No solution\n");return 0;}// 计算鸡和兔子的数量//假设所有动物全为四条腿,减去当前的腿数量//剩下的就是所有坤坤腿的数量,再除以二就算出了鸡的数量int x = (4 * n - m) / 2; // 鸡的数量//马的数量就自然得出来了int y = n - x;           // 马的数量// 判断数量是否为非负数if (x >= 0 && y >= 0) {printf("%d %d\n", x, y);} else {printf("No solution\n");}return 0;
}

C++语言题解:

#include <iostream>
using namespace std;
int main() {int n, m;// 输入动物总数和腿的总数cin >> n >> m;// 判断腿数是否为偶数if (m % 2 != 0) {cout << "No solution" << endl;return 0;}// 计算鸡和兔子的数量// 假设所有动物全为四条腿,减去当前的腿数量// 剩下的就是所有坤坤腿的数量,再除以二就算出了鸡的数量int x = (4 * n - m) / 2; // 鸡的数量// 马的数量就自然得出来了int y = n - x;           // 马的数量// 判断数量是否为非负数if (x >= 0 && y >= 0) {cout << x << " " << y << endl;} else {cout << "No solution" << endl;}return 0;
}

伍 重生之我在洛师当伍仁王

读入然后判断首尾字符是否一致就行了

C语言题解:

#include <stdio.h>
int main()
{  int t; scanf("%d",&t);char str[110];for (int i = 0; i < t; ++i) {int n; scanf("%d",&n);for (int j = 0; j < n ; ++j) {scanf(" %c",&str[j]);}if (str[0]!=str[n-1]) {printf("YES\n");} else {printf("NO\n");}}return 0;
}

C++题解:

#include <iostream>
using namespace std;
int main(){int t; cin >> t;for(int i = 0; i < t; ++i){int n; cin >> n;string ss; cin >> ss;if(ss[0] != ss[n - 1]){cout << "YES" << endl;} else {cout << "NO" << endl;}}return 0;
}

陆 丸辣!这月饼怎么吃不完口牙

按要求一步一步计算,最后向上取整就可以了

C语言题解:

#include <stdio.h>
#include <math.h>int main() {double ans;int n;// 输入初始值和数量scanf("%lf %d", &ans, &n);for (int i = 0; i < n; ++i) {double x;scanf("%lf", &x);ans += x;  // 累加}// 输出结果的向上取整printf("%.0lf", ceil(ans));return 0;
}

C++题解:

#include<bits/stdc++.h>
using namespace std;
int main(){double ans;int n;cin >> ans >> n;for(int i = 0; i < n; ++i){double x; cin >> x;ans = ans + x;}cout << ceil(ans) ;return 0;
}

柒 哥们,她和别人不一样

先读入两个进行判断大多数的数,之后查找就行了

C语言题解:

#include <stdio.h>
int num[10010];
int main() {int n;scanf("%d", &n);// 读取前两个数scanf("%d %d", &num[0], &num[1]);if (num[0] == num[1]) {// 如果前两个数相等,继续遍历后续数字for (int i = 2; i < n; ++i) {scanf("%d", &num[i]);if (num[i] != num[0]) {printf("%d", i);  // 输出下标(0-based)return 0;}}} else {// 如果前两个数不相等,读取第三个数并判断scanf("%d", &num[2]);if (num[2] == num[1]) {printf("%d", num[0]);  // num[0] 是与众不同的数} else {printf("%d", num[1]);  // num[1] 是与众不同的数}}return 0;
}

C++语言题解:

#include <iostream>
using namespace std;
int num[10010];
int main()
{int n; cin >> n;cin >> num[0] >> num[1];if(num[0] == num[1]){for(int i = 2; i < n; ++i){cin >> num[i];if(num[i] != num[0]){cout << i ;return 0;}}}else{cin >> num[2];cout << (num[2] == num[1] ? 0 : 1);}return 0;
}

捌 放松,头晕是正常的。

普通的暴力计算会超时,因此我们引入一个全新的算法——前缀和

前缀和(Prefix Sum)是一种常用的算法技巧,主要用于快速计算数组中某个区间的元素和。它通过预处理,将数组的累积和存储起来,之后可以在常数时间内计算任意区间的和。这在处理多次区间查询时非常高效。

1、前缀和的定义

给定一个数组 arr,其前缀和数组 prefix_sum 的定义是:

prefix_sum[i] = arr[0] + arr[1] + ... + arr[i-1]

prefix_sum[i] 表示从数组起点 arr[0]arr[i-1] 的所有元素的累积和。

2、计算步骤

  1. 预处理前缀和数组

    • 初始化 prefix_sum[0] = 0(表示前 0 个元素的和为 0)。
  • 从第 1 个位置开始依次累加当前元素的值到 prefix_sum 中。
  1. 快速求任意区间和
    如果要计算数组中从位置 lr(包括 lr)之间的区间和,可以用:

    sum(l, r) = prefix_sum[r+1] - prefix_sum[l]
    

    通过前缀和数组,可以在 O(1) 的时间复杂度内计算任意区间的和。

3、示例

假设有数组 arr = [3, 2, 1, 4, 5],它的前缀和数组为:

prefix_sum[0] = 0
prefix_sum[1] = 3
prefix_sum[2] = 3 + 2 = 5
prefix_sum[3] = 3 + 2 + 1 = 6
prefix_sum[4] = 3 + 2 + 1 + 4 = 10
prefix_sum[5] = 3 + 2 + 1 + 4 + 5 = 15

假设要计算区间 [1, 3] 的和,即 arr[1] + arr[2] + arr[3],通过前缀和数组,我们可以得到:

sum(1, 3) = prefix_sum[4] - prefix_sum[1] = 10 - 3 = 7

4、前缀和的优点

  • 快速查询:对于多个区间和查询,前缀和方法可以在预处理 O(n) 的时间复杂度下,将后续的每次查询优化到 O(1)。
  • 适用场景:适用于频繁的区间和查询,如处理大量区间查询问题或数据统计问题。

通过前缀和技术,很多涉及连续区间操作的问题都可以得到高效解决。

如果没看懂的话可以在网上搜索教学视频自行学习

5、本题题解

C语言题解:

#include <stdio.h>
long long arr[100005];  // 存储输入的数字
long long prefixSum[100005];  // 存储前缀和int main() {int n, q;// 读入 n 和 qscanf("%d %d", &n, &q);// 读入数组for (int i = 1; i <= n; i++) {scanf("%lld", &arr[i]);}// 计算前缀和prefixSum[0] = 0;for (int i = 1; i <= n; i++) {prefixSum[i] = prefixSum[i - 1] + arr[i];}// 处理每一个查询while (q--) {int f, t;scanf("%d %d", &f, &t);// 利用前缀和快速求区间和printf("%lld\n", prefixSum[t] - prefixSum[f - 1]);}return 0;
}

C++题解:

#include <iostream>
using namespace std;
long long arr[100005];  // 存储输入的数字
long long prefixSum[100005];  // 存储前缀和int main() {int n, q; cin >> n >> q;// 读入数组for (int i = 1; i <= n; i++) cin >> arr[i];// 计算前缀和prefixSum[0] = 0;for (int i = 1; i <= n; i++) prefixSum[i] = prefixSum[i - 1] + arr[i];// 处理每一个查询while (q--) {int f, t; cin >> f >> t;// 利用前缀和快速求区间和cout << prefixSum[t] - prefixSum[f - 1] << endl;}return 0;
}

玖 圣杯战争

贪心考虑:

<1>可以先将长度大于1且全为0的区间进行操作,这样可以尽可能减小0的数量(因为我们想让最终得到的区间1尽可能的多)

<2>操作完成后对剩余的0和1数量进行统计,如果1的数量不大于0,那么就无法通过操作得到a = [1](可以自己画一下,很容易就能得到这个结论)

C语言题解:

#include <stdio.h>
#include <string.h>int main() {int t;scanf("%d", &t);  // 读取测试用例的数量while (t--) {int n;scanf("%d", &n);  // 读取字符串的长度char s[200005];  // 假设字符串长度不超过 100000scanf("%s", s);  // 读取字符串// 处理字符串,删除相邻的 '0'int newLength = 0;  // 新字符串的长度for (int i = 0; i < n; i++) {if (s[i] == '0' && (i > 0 && s[i - 1] == '0')) {// 跳过当前 '0'continue;}s[newLength++] = s[i];  // 将有效字符放入新位置}s[newLength] = '\0';  // 终止新字符串// 统计 '0' 和 '1' 的数量int c0 = 0, c1 = 0;for (int i = 0; i < newLength; i++) {if (s[i] == '0')c0++;elsec1++;}// 输出结果if (c0 >= c1)printf("NO\n");elseprintf("YES\n");}return 0;
}

C++语言题解:

#include <iostream>
#include <string>
using namespace std;int main() {int t;cin >> t;  // 读取测试用例的数量while (t--) {int n;cin >> n;  // 读取字符串的长度string s;  cin >> s;  // 读取字符串// 处理字符串,删除相邻的 '0'string new_s;  // 新字符串for (int i = 0; i < n; i++) {if (s[i] == '0' && (i > 0 && s[i - 1] == '0')) {// 跳过当前 '0'continue;}new_s += s[i];  // 将有效字符添加到新字符串中}// 统计 '0' 和 '1' 的数量int c0 = 0, c1 = 0;for (int i = 0; i < new_s.length(); i++) {if (new_s[i] == '0')c0++;elsec1++;}// 输出结果if (c0 >= c1)cout << "NO" << endl;elsecout << "YES" << endl;}return 0;
}

拾 这题真是签到题

读入时间,计算两个时间的时间差,并将这个时间差转换为秒为单位

时间差(秒) = 小时差 * 3600 + 分钟差 * 60 + 秒差

最后再用n乘上这个时间差就行了;

记得开long long!

C语言题解:

#include <stdio.h>
long long a,b,c,x,y,z,t;
int main(){scanf("%lld:%lld:%lld",&a,&b,&c);//scanf的独特scanf("%lld:%lld:%lld",&x,&y,&z);//输入办法哟!scanf("%lld",&t);printf("%lld",((x-a)*3600+(y-b)*60+(z-c))*t);return 0;
}

C++题解:

#include <iostream>
using namespace std;
long long a,b,c,x,y,z,t;
char m;
int main(){cin>>a>>m>>b>>m>>c>>x>>m>>y>>m>>z>>t; //读入cout<<((x-a)*3600+(y-b)*60+(z-c))*t; //时分秒的转换兼输出return 0;
} 

完结撒花!!!

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

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

相关文章

编程日记 更改redis存储默认序列化器

编程日记 更改redis存储默认序列化器 package com.haole.usercenter.service;import com.haole.usercenter.model.domain.User; import jakarta.annotation.Resource; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframewor…

结对对对项目

结对对对项目这个作业属于哪个课程 软件工程课程这个作业要求在哪里 个人项目 - 作业 - 计科22级34班 - 班级博客 - 博客园 (cnblogs.com)这个作业的目标 按照要求写一个四则运算生成器成员一 3122004883许億驰任务列表1. 实现命令行程序:创建一个命令行程序,能够生成小学四则…

闯关提交02

任务:Python实现wordcount1 import re2 from collections import defaultdict3 4 def wordcount(text):5 # 将文本转换为小写6 text = text.lower()7 8 # 使用正则表达式分割单词9 words = re.findall(r\b\w+\b, text) 10 11 # 使用 defaultdict…

M:接口耗时很短,页面数据回显慢?

1、页面卡顿,需要好长一段时间才能加载完成,可能是资源请求过多,再加上请求响应慢的原因。 每个浏览器都有资源请求并发数的限制,如何查看请求阻塞情况 到前端如何针对该限制进行优化? 先看问题: 1、设置服务端请求耗时(3S)客户端并发调用20个请求。(预留问题-见下方:…

中秋 -2024/9/17

今天是中秋假期最后一天,今天主要学习了动态规划算法,写了几个模板题 新算法学了迪杰斯特拉(Dijkstra)算法,只是过程了解了过程,还是不能用代码描述出来 寻找最短路径的算法

干盛辉的第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 介绍自己并进行评估,阐明自己的技能、薄弱点,表明期望的课程收获以及课程实践角色扮演姓名-学号 干盛辉-2022329301011一、自我介绍 (1)个人信息 大家好,我叫干盛辉,来自于浙江温州,是 22…

vscode配置java简易教程

java的新手快速配置一、下载jdk java官方地址:https://www.oracle.com/java/technologies/downloads/ 选择适合自己电脑的版本,并下载到一个自己喜欢的地方。二、配置环境变量 记住自己 jdk 的地址,例:我的 jdk 下载到了 D:\app\java 1、JAVA_HOME配置 点击 win 键后,搜索…

GitHub 配置 ssh key 的步骤及原理解释

原文:Github 配置 ssh key 的步骤(大白话+包含原理解释)本文涉及 SSH 相关知识,建议先阅读 SSH 原理与运用(一):远程登录 或者将其作为扩展资料。 前言 在 GitHub 上配置 ssh key 很容易,网上一大堆教程,但基本没有详细解释其原理的,为什么要配?每使用一台主机都要配…

贪吃蛇作业

贪吃蛇界面: 代码:import pygame import random import sys import tkinter as tk from tkinter import messagebox # 初始化pygame pygame.init() # 设置屏幕大小 screen_width = 640 screen_height = 480 screen = pygame.display.set_mode((screen_widt…

数据集的收集

我在这里找到了一个数据集的网站:https://www.kaggle.com/datasets 我这里找到了三个小数据集为例子分别如下: 我写的数据分析如下: 1.数据集名称房价回归数据集来源 https://www.kaggle.com/datasets/prokshitha/home-value-insights?resource=download数据集描述该数据集…

数字签名是什么?

原文:数字签名是什么?文中涉及的密码学基本知识,可以参见对称加密和非对称加密的区别。鲍勃有两把钥匙,一把是公钥,另一把是私钥。鲍勃把公钥送给他的朋友们——帕蒂、道格、苏珊——每人一把。苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效…

存储论——确定性存储模型模型精解

运筹学中的存储问题主要研究如何通过优化库存管理,确保在满足需求的同时,尽可能降低与库存相关的成本。这一问题在生产制造、物流运输、仓储等各个领域具有重要应用。核心目标是通过合理规划进货、存货和出货策略,实现成本最小化和资源的高效利用。在实际应用中,由于需求的…