首页 > 其他分享 >洛阳师范学院 ACM实验室 中秋娱乐赛“月饼代码大逃杀”题解

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

时间:2024-09-17 23:46:12浏览次数:8  
标签:大逃杀 main int 题解 scanf ACM num include

题解包括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 (){
    //读入t
    int 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 ()
{
    //读入t
	int 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 和 q
    scanf("%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];  // 假设字符串长度不超过 100000
        scanf("%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++;
            else
                c1++;
        }

        // 输出结果
        if (c0 >= c1)
            printf("NO\n");
        else
            printf("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++;
            else
                c1++;
        }
        // 输出结果
        if (c0 >= c1)
            cout << "NO" << endl;
        else
            cout << "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;
} 

完结撒花!!!

标签:大逃杀,main,int,题解,scanf,ACM,num,include
From: https://www.cnblogs.com/lyx9785/p/18417735

相关文章

  • 2017 ACM/ICPC Asia Regional Qingdao Online(SDKD 2024 Summer Training Contest J2)
    C-TheDominatorofStrings题意给定n个串,问是否有一个串包含其他所有串,有就输出这个串。思路如果有解,答案必定是最长串,一一比较即可。(没想到.find()就能过......
  • P11072 Alice and Bob 题解
    简单博弈题。先说结论,如果存在\(a_i=0\)使得\(1\lei\lea_1\)的话,那么先手必胜,否则后手必胜。若满足上述条件显然先手必胜,将\(0\)搞到第一个就行。否则Alice每操作一次,如果操作后满足了上述条件,那么Bob赢,否则Bob只要不动就行。但是下一轮Alice必须动,要不然两......
  • 【洛谷 P1048】[NOIP2005 普及组] 采药 题解(动态规划+01背包)
    [NOIP2005普及组]采药题目描述辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株......
  • 历年CSP-J初赛真题解析 | 2019年CSP-J初赛阅读程序(16-33)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<cstdio>#include<cstring>usingnamespacestd;charst[100];intmain(){scanf("%s",st);intn......
  • 【架构设计】多级缓存:应用案例与问题解决策略
    【架构设计】多级缓存:应用案例与问题解决策略多级缓存系统的工作原理及其在提升应用性能方面的关键作用。通过对比本地缓存与分布式缓存的特点| 原创作者/编辑:凯哥Java                    | 分类:架构设计系列教程多级缓存系统:提升性能的......
  • 【架构设计】多级缓存:应用案例与问题解决策略
      【架构设计】多级缓存:应用案例与问题解决策略 多级缓存系统的工作原理及其在提升应用性能方面的关键作用。通过对比本地缓存与分布式缓存的特点 | 原创作者/编辑:凯哥Java                    | 分类:架构设计系列教程 ......
  • 题解 CF993E 【Nikita and Order Statistics】
    初看这道题,以为又是什么数据结构数数题,没啥思路,结果推式子时搞出了一个类似可以卷积的玩意儿,所以果断\(FFT\)解决。那我们来分析问题:这道题里,值域没用,每一个数只要管它与\(x\)的相对大小关系即可。如果它小于\(x\)那么有贡献,赋值为一,否则为零。然后,可以求前缀和,区间部分......
  • CF1334F Strange Function 题解
    传送门定义一个函数\(f\),输入一个数组\(a\),输出一个数组\(b\)为\(a\)的子序列:\(b_1=a_1\),设\(b_i\)在\(a\)中的位置为\(pos_i\),则\(b_i\)为\(a_{pos_{i-1}+1}\sima_n\)中第一个严格大于\(b_{i-1}\)的数。\(n\le5\times10^5\),\(|p_i|\le10^9,1\lea_i,b_i\le......
  • 嘉应学院第一届新生娱乐赛第一场题解
    A一道简单的语法题,直接输出"hellonowcoder"即可。代码#include<stdio.h>intmain(){printf("hellonowcoder");}B也是一道语法题,考察分支结构。根据题意进行判断输出即可。代码#include<stdio.h>intmain(){inta,b;scanf("%d%d",&a,&......
  • [ARC096E] Everything on It 题解
    题目链接点击打开链接题目解法肯定考虑容斥钦定有\(a\)个数出现\(0\)次,有\(b\)个数出现恰好\(1\)次,其他\(n-a-b\)个数随便,容斥系数为\((-1)^{a+b}\)先给出方案数的表达式:\(\sum\limits_{a=0}^n\sum\limits_{b=0}^{n-a}(-1)^{a+b}2^{2^{n-a-b}}\binom{n}{a}\binom{......