ACM实训冲刺第四天

news2024/11/18 0:44:05

【碎碎念】最近的任务有点繁重,所以考虑到实际情况,视频学习决定放置一段时间,重点是学校的实训练习题,对于我而言,目标不是优秀/良好,综合考虑我的实际情况,保佑我及格、顺利通过就可!加油!


今日学习任务

1.复习代码

2.习题(Cleaning Shifts、Vanya and Lanterns)


复习代码

Anton and Letters(搞定)

#include<stdio.h> 
int main(){
	int flag[26];
	for(int i=0;i<=26;i++) flag[i]=0;
	
	char tmp;
	while(tmp!='}'){
		scanf("%c",&tmp);
		if(tmp=='}') break;
		if(tmp<'z'&&tmp>='a'){
			flag[tmp-'a']++;//需要记忆 
		}
	}
	int cnt=0;//需要记得初始化 
	for(int i=0;i<26;i++){
		if(flag[i]>0) cnt++;
	}
	printf("%d",cnt);
}

Sum of Digits(搞定)

#include<stdio.h> 
#include<stdlib.h>
#include<string.h>

char s[10000];
int sum=0;
int result =0;

int main(){
	
	scanf("%s",s);
	while(1){
		if(strlen(s)==1) break;
		for(int i=0;i<strlen(s);i++){
			sum+=s[i]-'0';
		}
		itoa(sum,s,10);
		result++;
	}
	
	
	printf("%d",result);
	return 0;
}

寒冰王座(搞定)

#include<stdio.h> 
int main(){
	int T,i,n,sum;
	while(scanf("%d",&T)!=EOF){
		if(T<1||T>100) break;
		
		for(i=0;i<T;i++){
			scanf("%d",&n);
			if(n<1||n>10000) break;
			if(n>=300) sum=n%50;
			else if (n>=150&&n<200) sum=n-150;
			else if (n>=200&&n<300) sum=n-200;
			else if (n<150) sum=n;
			printf("%d\n",sum);
		}
		//if(n<1||n>10000) break;
	}
	return 0;
}

Charm Bracelet(搞定)

#include <stdio.h>
int main(){
	//第一行输入 两个空格分隔的整数
	int n,m;
	scanf("%d %d",&n,&m) ;
	//定义状态
	int dp[12881] ;
	//初始化dp[i]=0 
	for(int i=0;i<=m;i++){
		dp[i]=0;
	}
	//转移方程
	for(int i=1;i<=n;i++) {//注意  i=1 
		//定义重量和价值 两个空格分隔的整数描述魅力i: W i和D i
		int w,d;
		scanf("%d %d",&w,&d) ;
		for(int j=m;j>=w;j--){//注意j>=w
			if(dp[j-w]+d>dp[j])
				dp[j]=dp[j-w]+d;
		}
	}
	printf("%d\n",dp[m]);
	return 0;
}

习题

Cleaning Shifts

如果考试遇到这道题,可以先跳过

思路已掌握

问题

描述:

农夫大卫有一片菜园,同时他有n条狗(1 ≤ n ≤ 25000)来看守。他的每条狗有固定的工作时间,并且一定能在工作时间内好好看守菜园。他把一天的时间分为t个时间段(1 ≤ t ≤ 1000000),分别是从1到t,希望每个时间段都至少有一条狗看守菜园。请你为这些狗分配工作,计算最少需要几条不同的狗,才能让每个时间段都至少有一条狗有看守菜园。注意,有可能不论怎么安排,都无法实现这个目标。

输入:

第一行输入是以空格分隔的两个整数n和t。第2行到第n+1行包含每条狗的工作时间,以两个空格分隔的整数表示,代表着这条狗工作的第一个时间段和最后一个时间段。

输出:

完成农夫大卫的目标需要的最少的狗的数量。如果不能完成该目标,输出-1。

样例1:

输入:
3 10
1 7
3 6
6 10

输出:
2

样例2:

输入:
4 100
21 50
50 81
1 20
80 99

输出:
-1

思路

【挑战程序设计竞赛 2章习题 poj 2376 Cleaning Shifts】 https://www.bilibili.com/video/BV13K421h7n5/?share_source=copy_web&vd_source=c1510692b9cb6018bf78570791d3ee02

代码思路

  1. 定义结构体与输入:首先定义了一个结构体node来存储区间信息,包含起始时间a和结束时间b。通过scanf接收输入的区间数量n和总时间t,随后逐个读取每个区间的起始和结束时间。

  2. 自定义排序:使用cmp函数作为比较器,实现了按区间起始时间升序排列,若起始时间相同则按结束时间降序排列,确保优先选择结束时间更晚的区间进行覆盖。通过sort函数对区间进行排序。

  3. 区间覆盖判断与计数

    • 首先检查第一个区间的起始时间是否为1,如果不是,则直接输出-1,表示无法覆盖整个区间。
    • 初始化end为第一个区间的结束时间,sum也为end,并设置已使用的区间计数cnt为1。
    • 遍历排序后的区间列表,对于每个区间,如果它的起始时间在当前已选区间结束时间的下一个位置或之内(即a[i].a<=end+1),则尝试更新最远的覆盖点为两者中的最大值(通过max(sum, a[i].b))。
    • 如果当前区间的起始时间大于end+1,说明当前区间无法接续前一区间,此时需要判断是否可以形成新的覆盖段:如果新区间的起始时间仍然在当前覆盖段的结束时间之后(即a[i].a>end+1),则直接输出-1;否则,增加计数器cnt,并将end更新为上一覆盖段的最远端点,然后继续尝试将当前区间加入覆盖。
    • 最后,检查最终覆盖的最远端点end是否等于总时间t,如果不等则输出-1,表示未完全覆盖;否则输出cnt作为最少所需区间的数量。

记忆方法

  1. 理解核心逻辑:关键是理解区间覆盖的贪心策略,即优先选择结束时间更晚的区间来尝试覆盖更长的连续时间线。

  2. 掌握排序技巧:记住如何根据问题需求自定义排序规则,这里是为了在遍历时优先考虑起始时间早且结束时间晚的区间。

  3. 区间迭代的分支处理:熟悉如何在遍历过程中分情况讨论区间能否连续覆盖,特别是如何通过更新endsum变量来维护当前的覆盖状态。

  4. 边界条件检查:特别注意代码中对边界条件的检查,比如起始时间不为1的情况,以及最终覆盖是否完整,这些是决定输出结果的关键。

代码

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <stdio.h>

using namespace std;

const int N = 1000010;

/*
Sample Input

3 10
1 7
3 6
6 10
Sample Output

2
*/
int n;
struct Range
{
    int l, r;
    bool operator< (const Range& W)const
    {
        return l < W.l;
    }
}range[N];

int main()
{
    int st, ed;
    scanf("%d%d", &n, &ed);
    st = 1;
    for (int i = 0; i < n; i++)
    {
        int l, r;
        scanf("%d%d", &l, &r);
        range[i].l = l; range[i].r = r;
    }

    sort(range, range + n);

    int res = 0;
    bool success = false;
    for (int i = 0; i < n; i++)
    {
        int j = i, r = -2e9;
        //所有区间起点在当前点前的  取终点最远的那个区间
        while (j < n && range[j].l <= st)
        {
            r = max(r, range[j].r);
            j++;
        }
        //如果所有区间都在当前点之前  那就无法覆盖了 返回-1 跳出
        if (r < st)
        {
            res = -1;
            break;
        }
        //选择区间个数加1
        res++;
        //选择后的所有区间已经覆盖到终点或者终点之后  那就得到了答案了
        if (r >= ed)
        {
            success = true;
            break;
        }
        //更新当前点 继续下一轮寻找可覆盖的区间
        st = r + 1;
        i = j - 1;
    }

    if (!success) res = -1;
    printf("%d\n", res);

    return 0;
}

#include <iostream>
#include<algorithm>
#include <stdio.h>
using namespace std;
struct node
{
    int  a,b;
};
struct node a[2500005];
bool cmp(node a,node b)
{
    if(a.a==b.a) return a.b>b.b;
    else return a.a<b.a;
}
//结构体排序的比较函数
int main()
{
    int  t,n;
    scanf("%d%d",&n,&t);
    for(int i=1; i<=n; i++)
    {
        scanf("%d%d",&a[i].a,&a[i].b);
    }
//习惯从1开始写
    sort(a+1,a+1+n,cmp);
//排序
    if(a[1].a!=1)
    {
        printf("-1\n");
        return 0;
    }
//如果开头值都做不到等于1,那不管后面如何肯定覆盖不了所有区间
    int end=a[1].b,sum=end,cnt=1;
//因为先确定了end,所以cnt的值为1
    for(int i=2; i<=n; i++)
    {
        if(a[i].a<=end+1)
        {
            sum=max(sum,a[i].b);
        }
//若每次比较的左断点在上一段区间的里面或等于end+1即end的旁边,就不断进行比较满足条件中最远的点,即sum最大。
        else
        {
            end=sum;
            if(a[i].a>end+1)
            {
                printf("-1\n");
                return 0;
            }
            else
            {
                cnt++;
                if(a[i].a<=end+1)
                {
                    sum=max(sum,a[i].b);
                }
            }
        }
    }
    if(end!=sum)
    {
        cnt++;
        end=max(sum,end);
    }

    if(end!=t) printf("-1\n");
    else printf("%d\n",cnt);
    return 0;
}

Vanya and Lanterns

问题

一条长为 L 的路,在坐标轴上范围是 [0,L],在 n个位置都放置了路灯,灯光能覆盖的半径相同,问半径至少为多少时灯光可以覆盖整条路。

Input

第一行包含两个整数 n,l(1≤n≤1000,1≤L≤109)分别代表路灯的数量和这条路的长度。
第二行包含 n个整数 ai(0≤ai≤L),即各个路灯所在的位置。
注意:多个路灯可能在同一位置,而且可能有路灯位于这条路的端点。

Output

输出一个精确到小数点后 99 位的实数 r,代表能使灯光可以覆盖整条路的情况下,路灯灯光半径的最小值。

思路

解题说明:题目的意思是有一条长度为 l 的街道,在这条街道上放置了n个相同的灯,设从一端位置为0,每个灯的位置在ai处,问灯的最小照射半径为多少时,才能满足整条街道都能被灯光照到。此题可以用贪心来做,由于除了两端的两个灯之外,每两个灯之间都是由两个灯共同照射的,故只需要求出两两灯之间的距离一半的最大值,再求出两端两个灯距离街道两端尽头的距离,三者的最大值就是所求的最小半径。

代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;

double ans=0;//半径 
int n;//路灯数量 
int l;//路的长度 
double loc[1001];//路灯所在位置 

int main(){
	scanf("%d %d",&n,&l);
	for(int i=0;i<n;i++)//路灯的位置 
		scanf("%lf",&loc[i]);
		
	sort(loc,loc+n) ;
	for(int i=0;i<n;i++)//两两比较,求路灯最大值 
		ans=max(ans,(loc[i]-loc[i-1])/2.0) ;
	if(loc[0]!=0)//起始无路灯
		ans=max(ans,loc[0]) ;
	if(loc[n-1]!=l)//终点无路灯
		ans=max(ans,l-loc[n-1]) ;
	printf("%.010lf\n",ans);
	return 0;
}

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

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

相关文章

机器学习算法应用——神经网络回归任务、神经网络分类任务

神经网络回归任务&#xff08;4-3&#xff09; 神经网络回归任务&#xff0c;通常指的是使用神经网络模型进行回归分析。回归分析是一种统计学方法&#xff0c;用于研究一个或多个自变量&#xff08;预测变量&#xff09;与一个因变量&#xff08;响应变量&#xff09;之间的关…

node pnpm修改默认包的存储路径

pnpm与npm的区别 PNPM和NPM是两个不同的包管理工具。 NPM&#xff08;Node Package Manager&#xff09;是Node.js的官方包管理工具&#xff0c;用于安装、发布和管理Node.js模块。NPM将包安装在项目的node_modules目录中&#xff0c;每个包都有自己的依赖树。 PNPM&#xf…

c++ STL 之栈—— stack 详解

vector 是 stl 的一个关联容器,名叫“栈”&#xff0c;何为“栈”&#xff1f;其实就是一个数组&#xff0c;但有了数组何必还需栈&#xff0c;这是一个高深的问题。 一、简介 1. 定义 栈&#xff0c;是一个柔性数组&#xff08;可变长数组&#xff09;&#xff0c;可以变大变小…

【教程向】从零开始创建浏览器插件(三)解决 Chrome 扩展中弹出页面、背景脚本、内容脚本之间通信的问题

第三步&#xff1a;解决 Chrome 扩展中弹出页面、背景脚本、内容脚本之间通信的问题 Chrome 扩展开发中&#xff0c;弹出页面&#xff08;Popup&#xff09;、背景脚本&#xff08;Background Script&#xff09;、内容脚本&#xff08;Content Script&#xff09;各自拥有独立…

设计模式2——原则篇:依赖倒转原则、单一职责原则、合成|聚合复用原则、开放-封闭原则、迪米特法则、里氏代换原则

设计模式2——设计原则篇 目录 一、依赖倒转原则 二、单一职责原则&#xff08;SRP&#xff09; 三、合成|聚合复用原则&#xff08;CARP&#xff09; 四、开放-封闭原则 五、迪米特法则&#xff08;LoD&#xff09; 六、里氏代换原则 七、接口隔离原则 八、总结 一、依赖…

R语言数据探索与分析-碳排放分析预测

# 安装和加载需要的包 install.packages("readxl") install.packages("forecast") install.packages("ggplot2") library(readxl) library(forecast) library(ggplot2)# 数据加载和预处理 data <- read_excel("全年数据.xlsx") co…

有哪些是618必买的数码好物,这几款千万别错过

备受瞩目的618购物节即将拉开帷幕&#xff0c;身为数码领域的资深发烧友&#xff0c;我迫不及待地要为大家呈现一系列精心挑选的数码产品。无论您是热衷于追求科技尖端的先锋者&#xff0c;还是希望用智能设备为生活增添一抹亮色的品味人士&#xff0c;这里总有一款能让您心动的…

【python】python中的argparse模块,教你如何自定义命令行参数

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

ARM基于DWT实现硬件延时(GD32)

软件延时的缺点 软件延时的精度差&#xff0c;受系统主频影响&#xff0c;调教困难 硬件延时 DWT数据跟踪监视点单元硬件延时 硬件延时实现代码 delay.c #include <stdint.h> #include "gd32f30x.h"/** *****************************************************…

【算法入门赛】A.坐标变换(推荐学习)C++题解与代码

比赛链接&#xff1a;https://www.starrycoding.com/contest/8 题目描述 武汉市可以看做一个二维地图。 牢 e e e掌握了一项特异功能&#xff0c;他可以“瞬移”&#xff0c;每次瞬移需要分别设定 x x x和 y y y的偏移量 d x dx dx和 d y dy dy&#xff0c;瞬移完成后位置会…

JMeter 如何应用于 WebSocket 接口测试

WebSocket: 实时双向通信的探索及利用 JMeter 进行应用性能测试 WebSocket 是一项使客户端与服务器之间可以进行双向通信的技术&#xff0c;适用于需要实时数据交换的应用。为了衡量和改进其性能&#xff0c;可以通过工具如 JMeter 进行测试&#xff0c;但需要先对其进行适配以…

出差行程到底怎么管?这个“高分指南”划重点来了!

在日常商旅过程中&#xff0c;出差行程计划是必不可少的环节。公司需要以此为依据判断行程是否有必要、是否合理&#xff0c;确保出差行程与公司的业务需求相符。 通过胜意费控云&#xff0c;员工填写出差申请时&#xff0c;行程计划智能生成&#xff0c;平台自动匹配并带出差标…

EasyRecovery(易恢复) 使用测试及详细使用方法

你有没有因为数据丢失懊悔不已&#xff0c;EasyRecovery&#xff08;易恢复&#xff09;&#xff0c;来自美国拥有38年数据恢复的软件&#xff0c;只有收费版&#xff0c;重要事情说三遍&#xff0c;EasyRecovery 没有免费版&#xff0c;可以成功找回删除的部分文件&#xff0c…

歌手舞台再掀风云

《歌手》舞台再掀风云&#xff0c;重磅消息来袭——国际巨星亚当兰伯特空降踢馆&#xff0c;一场音乐盛宴即将点燃激情&#xff01;消息一出&#xff0c;粉丝欢呼&#xff0c;热议如潮。亚当兰伯特&#xff0c;这位曾让世界为之倾倒的音乐天才&#xff0c;如今即将登陆《歌手》…

工业中常见大数据技术组件

随着大数据技术在各行各业的广泛应用&#xff0c;数据产品经理的角色也变得越来越重要。了解常见的大数据技术组件对于数据产品经理来说至关重要&#xff0c;因为这有助于他们更好地设计产品架构和功能模块&#xff0c;满足数据处理和分析的需求。在处理海量数据的产品中&#…

keep健身小程序基于FastAdmin+ThinkPHP+UniApp(源码搭建/上线/运营/售后/更新)

基于FastAdminThinkPHPUniApp&#xff08;目前仅支持微信小程序和公众号&#xff09; 开发的健身相关行业微信小程序&#xff0c;程序适用于健身房、瑜伽馆、游泳馆、篮球馆等健身培训场所。平台拥有课程售卖、课程预约、多门店管理、私教预约、教练端、会员卡办理、在线商城、…

el-checkbox选中后的值为id,组件显示为label中文

直接上代码 方法一 <el-checkbox v-for"item in list" :key"item.id" :label"item.id">{{中文}} </el-checkbox> 方法二 <el-checkbox-group class"flex_check" v-model"rkStatusList" v-for"item…

Python可以自学但是千万不要乱学,避免“埋头苦学”的陷阱!

前言 Python可以自学但是千万不要乱学&#xff01; 归根结底因为学习是个反人性的过程&#xff01; 复盘没学下去的网课&#xff0c;都有以下特点&#xff1a; &#x1f605; 臣妾听不懂啊&#xff01; 初次接触编程遇到太多抽象高深的概念&#xff0c;不了解老师口中的一个…

队列 + 宽搜(BFS)

目录 leetcode题目 一、二叉树的层序遍历 二、二叉树的层序遍历 II 三、N叉树的层序遍历 四、二叉树的锯齿形层序遍历 五、二叉树最大宽度 六、在每个树行中找最大值 七、二叉树的层平均值 八、最大层内元素和 九、二叉树的第K大层和 十、反转二叉树的奇数层 leetco…

mac第三方软件怎么删除 MacBook卸载第三方应用程序 mac第三方恶意软件删除不了怎么办呢

Mac是一款优秀的个人电脑&#xff0c;它拥有流畅的操作系统、强大的性能和丰富的应用程序。但是&#xff0c;随着使用时间的增加&#xff0c;你可能会发现你的Mac上安装了一些不需要或者不喜欢的第三方软件&#xff0c;这些软件可能会占用你的空间、影响你的速度或者带来安全风…