ACM第三次考核题解

news2024/11/17 19:38:52

ACM第三次考核题解

题目序号难度题目编号题目考察知识点
1签到题A这是一道很难的题!!!输出
2迷之难度F神说要有光,于是有了手电筒贪心
3简单BThis is a real English problem!思维 英语
4简单C玩具简单排序
5简单I“近义词”字符数组
6一般G一起来运动!!二分搜索
7一般E这糖保甜吗?GCD 模拟
8一般K卖教材模拟
9一般D简单切割小游戏结构体运用
10一般J简单截断前缀和
11困难M马学长的小游戏博弈
12困难H分提拉米苏二分答案
13困难L算两次数学

A 这是一道很难的题!!!

print("想看马学长跳舞")

F 神说要有光,于是有了手电筒

需要推出一个结论:当最大的电池电量高于其他所有电池电量,则可以把其他电池给消耗完;如果不能,其他电池可以相互搭配, 11 1 1 11地消耗,始终能够把所有的电池电量和 ÷ 2 ÷2 ÷2(向下取整)消耗完,比如样例中 222 2 2 2 222 3 3 3个电池,可以用第一个电池和第二个电池消耗 1 1 1的电量,然后再和第三个电池消耗1的电量,最后第二个和第三个一起消耗 1 1 1的电量。

#include <iostream>
using namespace std;
#define ll long long
int main() {
    ll sum = 0, ans = 0, n = 0, a = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a;
        ans = max(a, ans);
        sum += a;
    }
    if (ans > sum / 2) cout << sum - ans;
    else cout << sum / 2;
    return 0;
}

B This is a real English problem!

题意:对于给定一个质数 n n n,输出一个最小的质数 m m m使得 n + m n+m n+m是合数。

这是一个很简单的题目,可以证明答案不是 2 2 2就是 3 3 3。因为如果是奇数+3之后一定为偶数,一定为合数,但需要考虑 + 2 +2 +2后是不是合数,因为此题找的是最小的 m m m,偶数 + 2 +2 +2仍然为偶数,一定是合数。

#include<bits/stdc++.h>
using namespace std;
int n;
bool check(int x){
    for(int i = 2 ; i <= n ; i++)
        if(x%i==0) return true;
    return false;
}
int main()
{
    cin >> n;
    if(check(n+2)) cout << 2;
    else cout << 3;
    return 0;
}

C 玩具

/*
* 本题思路较为简单就是先排序然后从后往前取最大的那个就可以了
* 如果你觉得的冒泡太麻烦,可以去学一下 C++ 用 C++ 的 algorithm 头文件里的 sort 函数进行排序 
*/
#include <stdio.h>
#define N 1010

int a[N];

int main()
{
	int n, sum = 0;
	scanf("%d", &n);
	
	for (long long int i = 1; i <= n; i ++ )
		scanf("%d", &a[i]);
	// 对数组进行排序
	for (int i = 1; i < n; i ++ ) 
		for (int j = 1; j <= n - i; j ++ ) 
			if (a[j] > a[j + 1]) {
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
	// 从后往前取,两个两个取,只把大的那个算入结果内
	for (long long int j = n; j >= 1; j -- ) 
	{
		sum += a[j];
		j --; // 略过下一个
	}
	
	printf("%d\n", sum);
	
	return 0;
}
//-------------- 我是一个分割线 -----------------------
/*
* 如果你用 c++ 并使用 algorithm 这个头文件
* 第18行至第24行的排序算法可以替换成下面这行代码 
	sort(a + 1, a + 1 + n); 
*/ 
 

I “近义词”

看了题目大家应该都知道是直接遍历比较就可以,最主要的是怎么存多个字母,因为比较的字符串是在最后给出,这里提供四个思路:

1.用二维字符数组

2.用一维字符数组(但计算位置时需要退一下坐标)

3.用c++的vector容器

4.用c++的string数组

下面给出两种解法1和3的代码

#include <stdio.h>
int main()
{
    int n,m;
    int num=0;
    int tem=0;
    char a[1100][1100];
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;i++)
    {
        scanf("%s",a[i]);
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(a[i][j]!=a[n][j])
                tem++;
            if(tem>2)
                break;
        }
        if(tem<=2)
            num++;
        tem=0;
    }
    printf("%d",num);
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int n,m;
vector<string> v;
string s;
int ans;
int main()
{
	cin >> n >> m ;
	for(int i = 1 ; i <= n ; i ++)
	{
		string s;
		cin >> s;
		v.push_back(s);
	}
	cin >> s;
	for(int i = 0 ; i < v.size() ; i ++)
	{
		int t = 0;
		string ss = v[i];
		for(int i = 0 ; i < ss.size() ; i++)
		{
			if(ss[i] != s[i]) t++;
		}
		if( t <= 2) ans ++;
		//cout << t << endl;
	}
	cout << ans;
}

G 一起来运动!!

这题本意是靠二分,但由于出题人疏忽,数据没有捏好,让你们 O ( n 3 ) O(n^3) O(n3)给过了,气死了!!!

请添加图片描述

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1100;
int a[N];
int n;

int main() {
    cin >> n;
    for(int i = 0; i < n; i ++) cin >> a[i];
    sort(a, a + n);
    int ans = 0;
    for(int i = 0; i < n; i ++) {
        for(int j = i + 1; j < n; j ++) {
            int l = lower_bound(a , a + n, 2 * a[j] - a[i]) - a;
            int r = upper_bound(a , a + n, 3 * a[j] - 2 * a[i]) - a;
            ans += r - l;
        }
    }
    cout << ans << endl;
    return 0;
}

E 这糖保甜吗?

#include<stdio.h>
#include<math.h>

int GCD(int m, int n)
{
	int tmp;
	m = abs(m);
	n = abs(n);
	// 保证后续m%n为较大数除以较小数
	if (m<n)
	{
		tmp = m;
		m = n;
		n = tmp;
	}
	// 辗转相除的过程,终止条件是余数为0
	while (m % n != 0)
	{
		tmp = m;
		m = n;
		n = tmp % n;
	}
	// 返回除数(较小数)
	return n;
}

int main() {
	int a, b, c, d;
	int gcd; // 最大公约数
	int den, num; // 分子num 分母den
	int op; // 操作数
	
	scanf("%d",&op);
	scanf("%d %d %d %d",&a,&b,&c,&d);
	
		gcd = GCD(b, d);
		
		// 以下是分数运算过程
		// 通分——分母最大
		den = b * d / gcd;
		
		// den/b 为分母扩大了多少倍 分子也要相应扩大倍数
		if (op == 1)
			num = a * (den / b) + c * (den / d);	
		else
			num = a * (den / b) - c * (den / d);
		
		// 以下是分数化到最简过程
		// 避免输出0/n
		
		if (num == 0) {
			printf("0\n");
		} else if (num == den) {
			printf("1\n");
		}else {
			gcd = GCD(num, den); 
			num = num / gcd;
			den = den / gcd;
			printf("%d/%d",num,den);
		}
	
	return 0;
}

K 卖教材

根据题意模拟即可,但需要注意的是当给20元找零的时候需要先使用 5 + 10 5+10 5+10,如果没有再考虑 5 + 5 + 5 5+5+5 5+5+5

#include <bits/stdc++.h>
using namespace std;
int num5,num10,num20;
int ans=0;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        if(x==5) {
        	num5++;
        	ans++;
		}
        else if(x==10){
            if(num5>0){
                num5--;
                num10++;
                ans++;
            }
            else {
                break;
            }
        }
        else {
            if(num5>0&&num10>0){
                num5--;
                num10--;
                num20++;
                ans++;
            }
            else if(num5>=3){
                num5-=3;
                num20++;
                ans++;
            }
            else {
                break;
            }
        }
    }
    printf("%d",ans*5);
    return 0;
}

D 简单切割小游戏

使用结构体存每一段,排序之后贪心地从最后一个位置切割(这也是怎么排序的依据)

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5+5;
struct node{
	int a, b;
}s[N];
bool cmp(node x, node y){
	if(x.b == y.b){
		return x.a < y.a;
	}
	return x.b < y.b;
}
void solve()
{
	int n, m;
	scanf("%d%d",&n,&m);
	for(int i = 0;i < m;i++){
		scanf("%d%d",&s[i].a,&s[i].b);
		if(s[i].a > s[i].b)swap(s[i].a,s[i].b);
	}
	sort(s,s+m,cmp);
	int flag = 0, ans = 0;
	for(int i = 0;i < m;i++){
		if(flag <= s[i].a){
			flag = s[i].b;
			ans++;
		}
	}
	printf("%d",ans);
}
int main()
{
	solve();
	return 0;
}

J 简单截断

巧妙地运用了前缀和,第一个切割点一定在所有数和的 1 3 \frac{1}{3} 31处,而第二个切割点一定在所有数和的 2 3 \frac{2}{3} 32

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int sum[N];
int n;
int main(){
   
    cin >> n;
    
    for(int i = 1 ; i <= n ; i++)
    {
        int x;
        cin >> x;
        sum[i] = sum[i-1] + x;
    }
    if(sum[n]%3!=0){
        cout << 0;
        return 0;
    }
    
    long long cnt = 0,ans = 0;
    for(int i = 1 ; i <= n - 2; i ++)
    {
        if(sum[i] == sum[n]/3) cnt ++;
        if(sum[i+1] == sum[n]/3*2) ans += cnt;
    }
    cout << ans;
    return 0;
}

M 马学长的小游戏

#include <iostream>
using namespace std;
int main()
{
	int n = 1;
	
	while(1) {
		cin >> n; 
		if (n == 0) break;
		if (n % 2 == 1) printf("maxuezhang win\n");
		else printf("xiaoJtongxue win\n");
	}
	
	return 0;
}

H 分提拉米苏

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int l[N], r[N];
int n, k;
bool check(int mid){
    int res = 0;
    for(int i = 0 ; i < n ; i ++)
    {
        res += (l[i]/mid)*(r[i]/mid);
        if(res >= k) return true;
    }
    return false;
}
int main()
{
    cin >> n >> k;
    for(int i = 0 ; i < n ; i ++) cin >> l[i] >> r[i];

    int l = 1 , r = 10000;
    while(l < r){
        int mid = (l + r + 1) / 2;
        if(check(mid)) l = mid;
        else r = mid - 1;
    }
    cout << l << endl;
    return 0;
}

L 算两次

#include <bits/stdc++.h>
#define ll long long
#define N 100005
int f[N],p[N],nu1[N],nu2[N];
int num1=0,num2=0;
int ma=0;
using namespace std;
int num=0;
void init_p()
{
    f[1]=1;
    num=0;
    for(int i=2;i<=N;i++){
        if(f[N]==0){
            p[++num]=i;
        }
        for(int j=1;j<=num;j++){
            if(i*p[j]<N) f[i*p[j]]=1;
            if(i%p[j]==0||i*p[j]>N) break;
        }
    }
}
int main()
{
    init_p();
    int m;
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        int op,x;
        scanf("%d%d",&op,&x);
        if(x<0){
            num1++;
            x=-1*x;
        }
        ma=max(ma,x);
        if(op==1){
            for(int i=1;p[i]<=x;i++){
                if(f[x]==0){
                    nu1[x]++;
                    break;
                }
                while(1){
                    if(x%p[i]==0){
                        nu1[p[i]]++;
                        x/=p[i];
                    }
                    else break;
                }
            }
        }
        else {
            for(int i=1;p[i]<=x;i++){
                if(f[x]==0){
                    nu1[x]--;
                    break;
                }
                while(1){
                    if(x%p[i]==0){
                        nu1[p[i]]--;
                        x/=p[i];
                    }
                    else break;
                }
            }
        }
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        int op,x;
        scanf("%d%d",&op,&x);
        if(x<0){
            num2++;
            x=-1*x;
        }
        ma=max(ma,x);
        if(op==1){
            for(int i=1;p[i]<=x;i++){
                if(f[x]==0){
                    nu2[x]++;
                    break;
                }
                while(1){
                    if(x%p[i]==0){
                        nu2[p[i]]++;
                        x/=p[i];
                    }
                    else break;
                }
            }
        }
        else {
            for(int i=1;p[i]<=x;i++){
                if(f[x]==0){
                    nu2[x]--;
                    break;
                }
                while(1){
                    if(x%p[i]==0){
                        nu2[p[i]]--;
                        x/=p[i];
                    }
                    else break;
                }
            }
        }
    }
    if(num1%2!=num2%2){
        printf("NO");
        return 0;
    }
    for(int i=1;p[i]<=ma;i++){
        if(nu1[p[i]]!=nu2[p[i]]){
            printf("NO");
            return 0;
        }
    }
    printf("YES");
    return 0;
}

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

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

相关文章

物联网系统中基于IIC通信的数字温度传感器测温方案

01 物联网系统中为什么要使用数字式温度传感器芯片 物联网系统中使用数字式温度传感器芯片的原因主要有以下几点&#xff1a; 高精度与稳定性 高精度测量&#xff1a;数字式温度传感器芯片&#xff0c;如DS18B20&#xff0c;采用芯片集成技术&#xff0c;能够有效抑制外界不…

MISC - 第八天(gnuplot绘图工具,核心价值观编码,outguess隐写工具,ntfs流)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家继续讲解MISC的相关知识 梅花香之苦寒来 附件信息: 附件是一张图片&#xff0c;放到hxd检索相关信息 发现有一段十六进制文本 https://gchq.github.io/CyberChef/ 这个网站拥有丰富的编码和解码内容…

matlab中在一个图上持续画多条曲线的方法

在数据分析的过程中&#xff0c;会遇到一种情况&#xff0c;就是想对多组数据进行分析&#xff0c;这时就想把他们放在同一张图里&#xff0c;来看他们表现出来的特征。如下图所示&#xff1a; 例如&#xff0c;我这里有几组数据&#xff0c;想对他们的整体趋势进行分析。 1、…

四非人的保研之路,2024(2025届)四非计算机的保研经验分享(西南交通、苏大nlp、西电、北邮、山软、山计、电科、厦大等)

文章目录 一、个人背景二、夏令营北京邮电大学CS西南交通大学CS深圳大学CS苏州大学NLP南开大学CS 三、预推免北京邮电大学CS华东师范大学 CS和大数据电子科技大学 CS东北大学 CS厦门大学 信息学院山东大学 CS和SE西安电子科技大学 CS 四、个人经验五、上岸 一、个人背景 学校专…

Megabit兆比特加密货币市场比特币—看涨信号预示着比特币价格上涨

在过去的30天里&#xff0c;比特币[BTC]在经历了2个月的极端波动后&#xff0c;其价格图表出现了显著反弹。事实上&#xff0c;自7月份触及70016美元的高点以来&#xff0c;BTC已经大幅下跌&#xff0c;甚至跌至4.9万美元的当地低点。 Megabit兆比特自成立以来,Megabit凭借用户…

Thingsboard 网关实战 modbus通信 rpc下发控制指令

我们这里说的是Thingsboard通过网关modbus通信接入设备&#xff0c;然后通过rpc下发指令去控制开关信号的设备&#xff0c;不会网关通过modbus接入设备的&#xff0c;可以看我之前的文章&#xff0c;从小白教学。 下面我们就说如何下发rpc开关信号指令 第一步.在modbus配置文…

谷歌外链需要持续发吗?

肯定是需要的&#xff0c;在搜索引擎优化的世界里&#xff0c;外链就像是给你网站的“投票”。搜索引擎会根据这些“投票”来判断你网站的权威性和相关性。要想让这些“投票”真正发挥作用&#xff0c;就必须保持一定的持续性和稳定性。如果你停滞不前&#xff0c;竞争对手可就…

Shopify电商平台的接口对接

Shopify API是一组定义好的函数或方法&#xff0c;通过这些接口&#xff0c;开发者可以与Shopify商店进行数据交互&#xff0c;实现各种功能。比如&#xff0c;你可以在你的应用中通过接口获取商品信息、创建订单、查询物流状态等等。 为什么需要对接Shopify API&#xff1f; …

校企合作 | 宝兰德与西安航空职业技术学院共筑智慧教育新高地

在教育领域持续变革的今天&#xff0c;智慧教育作为提升教学质量、优化资源配置的关键策略&#xff0c;正逐步成为教育发展的主流趋势。近日&#xff0c;西安航空职业技术学院副校长郭红星、信息中心副主任李畅及主任李永锋等领导莅临宝兰德西安研发中心&#xff0c;双方就智慧…

使用PHP获取商品描述API:解锁电商数据的金钥匙

在电子商务领域&#xff0c;获取商品的详细信息对于商家和消费者来说至关重要。taobao作为中国最大的在线购物平台之一&#xff0c;提供了丰富的API接口供开发者使用。其中&#xff0c;商品描述API允许开发者获取商品的详细描述&#xff0c;这对于提升用户体验和优化商品页面至…

sql-labs靶场

第一关&#xff08;get传参&#xff0c;单引号闭合&#xff0c;有回显&#xff0c;无过滤&#xff09; ?id-1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schemasecurity) -- 第二关&#xff08;get传参&#xff0c;无闭…

如何使用ChatGPT,提示词篇之【编程代码】ChatGPT镜像网站

一、 ChatGPT可以做什么&#xff1f; ChatGPT能做的事情非常多&#xff01;它不仅仅是一个对话AI。以下是一些主要功能&#xff1a; 1. 回答问题&#xff1a;无论是学术问题、技术问题&#xff0c;还是生活琐事&#xff0c;ChatGPT都能提供帮助。 2. 写作助手&#xff1a;可以…

Unity3D 客户端多开

Unity3D 实现客户端多开 客户端多开 最近在做好友聊天系统&#xff0c;为了方便测试&#xff0c;需要再开一个客户端。 简单的方法&#xff0c;就是直接拷贝一个新的项目&#xff0c;但是需要很多时间和占用空间。 查阅了网络资料&#xff0c;发现有一种软链接&#xff0c;…

STM32+PWM+DMA驱动WS2812 —— 2024年9月24日

一、项目简介 采用STM32f103C8t6单片机&#xff0c;使用HAL库编写。项目中针对初学者驱动WS2812时会遇到的一些问题&#xff0c;给出了解决方案。 二、ws2812驱动原理 WS2812采用单线归零码的通讯方式&#xff0c;即利用高低电平的持续时间来确定0和1。这种通信方式优点是只需…

【赵渝强老师】Job控制器多工作队列的并行方式

Kubernetes Job是一次性任务的控制器。它控制Pod中的容器执行完成任务后不会再重启&#xff0c;并将容器的状态设置为“Completed”。如果Pod中的容器出现了异常终止的情况&#xff0c;Job控制器会根据设置的重启策略进行Pod的重启。如果因为Node节点的故障导致Pod无法正常运行…

[leetcode] 70. 爬楼梯

文章目录 题目描述解题方法动态规划java代码复杂度分析 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1…

鸿蒙HarmonyOS NEXT 电商APP开发,打造你的专属购物商城

2024年年初&#xff0c;鸿蒙HarmonyOS Next星河版强势发布&#xff0c;随着鸿蒙系统的普及和应用场景的拓展&#xff0c;市场需求将持续增加。鸿蒙系统已经应用于华为的智能手机、平板电脑、智能家居等多个领域&#xff0c;并有望在未来拓展到智能汽车、物联网等更多领域。这为…

一起发现CMake太美-03-CMake是什么CMake的安装

本系列课程的主要内容包括&#xff1a; 点击本课程的 链接 可以进入视频课程的学习。 下面介绍本系列课程的第三课的主要内容&#xff0c;本节课介绍了CMake在Ubuntu环境、docker环境、CentOS环境上的安装过程进行了详细介绍。以便大家能够学会如何在linux环境中快速搭建CMak…

SpringMVC源码-SpringMVC源码请求执行流程及重点方法doDispatch讲解

一、开始请求 在浏览器访问http://localhost:8080/spring_mymvc/userlist这个接口&#xff0c;是个get请求。 FrameworkServlet类的service方法会被请求到: 调用路径如下&#xff1a; service:945, FrameworkServlet (org.springframework.web.servlet) service:764, HttpSer…

数据结构(7.3_5)——红黑树的插入和删除

红黑树的插入 注意&#xff1a;插入时候重点考察“不红红”特性&#xff08;红黑树的性质&#xff09; 染色&#xff1a;哪几个结点有变动就红的变黑&#xff0c;黑的变红 RR、LL、LR、RL从爷结点开始算起 非根结点的插入只需要判断是否违背的“不红红”特性 练习&#xff1…