ACM实训冲刺第八天

【碎碎念】由于昨天做的题都有思路,加上今天有点疲惫,故今天先不复习了,直接开始今天的算法学习


Tokitsukaze and All Zero Sequence

问题

 

思路 

 

  1. 读入测试用例数:首先读取一个整数t,表示接下来会有t组数据需要处理。
  2. 遍历每个测试用例:对于每组数据,先读取序列的长度n,然后读取这n个整数到数组中,并使用另一个数组a来统计每个数字出现的次数。
  3. 检查重复与计算结果
    • 如果数组中有数字0出现,直接计算并输出非零数字的个数。
    • 否则,根据是否有其他重复数字(通过标志变量flag判断),决定输出序列长度加1(无重复)或保持原长度(有重复)。

 

代码

#include<stdio.h>
int main(){
	// 第一行输入用例数量t 
	int t;
	scanf("%d",&t) ; // 读取测试用例数量

	// 遍历t个用例
	for(int i =0; i<t; i++) {
		int n; // 序列a的长度
		int flag=0; // 初始化标志变量,用于记录是否有重复元素,默认假设无重复
		int ch; // 临时变量,用于存储当前读取的元素值
		int a[101]={0}; // 初始化数组,用于统计各元素出现次数,长度设置为101以容纳可能的输入值(0-100)

		// 输入当前序列的长度
		scanf("%d",&n) ;

		// 读取并处理序列中的每个元素
		for(int j=0; j<n; j++){
			scanf("%d",&ch); // 读取序列中的一个元素
			a[ch]++; // 对应元素的计数加一,实现统计各元素出现次数

			// 检查当前元素是否已出现过,若有则设置flag为1表示有重复
			if(a[ch]>1)
				flag = 1;	
		}

		// 根据条件输出结果
		if(a[0]>0){ // 若存在0,则计算非零元素个数
			printf("%d\n",n-a[0]); // 输出非零元素数量
		}else{
			// 若没有0,根据是否有重复决定输出结果
			if(flag==0) // 无重复元素
				printf("%d\n",n+1); // 序列本身长度加1
			if(flag==1) // 存在重复元素
				printf("%d\n",n); // 直接输出原序列长度
		}
	}
}

Aggressive cows

问题

农夫约翰建了一个新的长谷仓,有N (2 <= N <= 100,000)个牲口棚。摊位沿直线排列在x1,…,xN (0 <= xi <= 1,000,000,000)。

他的C (2 <= C <= N)头奶牛不喜欢这种谷仓布局,一旦被关进牛栏,它们就会互相攻击。为了防止奶牛互相伤害,FJ想把奶牛分配到牛栏里,这样它们之间的最小距离就尽可能的大。最大的最小距离是多少?
输入
*第一行:两个空格分隔的整数:N和C

*第2行…N+1:第i+1行包含一个整数摊位位置xi
输出
*第一行:一个整数:最大的最小距离

思路

我的潦草思路:感觉有点类似于路灯问题

其他人的代码思路 经过验证代码有误,只需参照思路注释即可

//其他人的思路代码,不过输入输出格式有出入
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;
 
int a[100],n,c;
 
bool fun(int m){//只要相隔m的牛的个数多余实际牛的个数,就可以返回true
    int cnt = 1,cur = 0,next=1;//cur是当前牛编号,next是下一只牛的编号,cnt是用来计数的
    while(next<n){
        next++;//指向下一只牛
        if(a[next]-a[cur]>=m){//当前编号牛的位置与下一编号牛的位置只要大于m
            cnt++;//满足条件的牛的个数加1
            cur=next;//把当前牛调整为next
        }
    }
    if(cnt>=c)return true;//只要相隔m的牛的个数多余实际牛的个数,就可以返回true
    else return false;
}
 
int main ()
{
    printf("please input the number of room:");
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    printf("input the number of cow: ");
    scanf("%d",&c);
    int left=1,right=(a[n-1]-a[0])/(c-1);
    //求解下界是1,就是他们紧挨着的情况,
    //上界是最大值-最小值除(牛的个数-1),因为两头都可以取值,蓝哥思考一下为什么是牛的个数-1
    
    while(left<right){
        int mid = ((left+right)+1)/2;
        //精髓,此处是为了确保二分法能取到最右边的数,故要让除二之前先加一,即向上取整
        
        if(fun(mid))left=mid;
        //此处我们需要找到满足条件的最大的值,所以如果mid点满足条件,要让left=mid,继续找更大的点
        
        else right=mid-1;
    }
    cout<<"the answer is : "<<left<<endl;
    printf("the answer is :%d",left);
    //最后一次求得的满足条件的值mid,已经赋给了left,做一输出left
    return 0;
}

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;

int a[100], n, c;

// 方法函数:判断是否能在最小间隔为m的情况下放置至少c个摊位
bool fun(int m) { // 只要相隔m的牛的个数多余实际牛的个数,就可以返回true
    int cnt = 1, cur = 0, next = 1; // 初始化计数器、当前牛位置和下一个牛位置
    while (next < n) {
        next++; // 移动到下一个牛的位置
        if (a[next] - a[cur] >= m) { // 检查当前牛与下一牛之间距离是否大于等于m
            cnt++; // 计数器加1,表示找到了一个符合条件的位置
            cur = next; // 更新当前牛的位置为下一个牛的位置
        }
    }
    if (cnt >= c) return true; // 如果找到的位置数大于等于c,则返回true,表示可行
    else return false; // 否则返回false
}

int main() {
    // 输入:第一行包含两个空格分隔的整数,N(牛的数量)和C(至少需要的摊位数)
    scanf("%d%d", &n, &c);
    
    // 接下来N行,每行一个整数,表示每头牛所在位置
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    
    // 初始化二分查找范围(最小距离的上下界)
    int left = a[0], right = a[n - 1];
    int ans = 0; // 用于存储最终答案,即最小满足条件的距离
    
    // 对位置数组进行排序,以便进行二分查找
    sort(a, a + n);
    
    // 二分查找过程
    while (left < right) {
        int mid = ((left + right) + 1) / 2; // 计算中间值,向上取整确保能探索到所有可能
        if (fun(mid)) { // 如果以mid为最小间隔可以放置c个或更多摊位
            ans = mid; // 更新答案
            left = mid + 1; // 缩小搜索区间到右半部分
        } else {
            right = mid - 1; // 否则,缩小搜索区间到左半部分
        }
    }
    
    // 输出最终答案,即最小满足条件的摊位间距
    printf("%d", ans);
    return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【达梦数据库】搭建 DM->mysql dblink

DM->mysql dblink 1安装mysql odbc rpm -ivh mysql-connector-odbc-5.3.14-1.el7.x86_64.rpm2mysql创建远程用户与远程数据库 mysql> show databases; ------------------------- | Database | ------------------------- | information_schema | …

【Linux系统编程】第十九弹---进程状态(下)

​​​​​​​ ✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、僵尸进程 2、孤儿进程 3、运行状态 4、阻塞状态 5、挂起状态 6、进程切换 总结 1、僵尸进程 上一弹…

OpenHarmony 3GPP协议开发深度剖析——一文读懂RIL

市面上关于终端&#xff08;手机&#xff09;操作系统在 3GPP 协议开发的内容太少了&#xff0c;即使 Android 相关的学习文档都很少&#xff0c;Android 协议开发书籍我是没有见过的。可能是市场需求的缘故吧&#xff0c;现在市场上还是前后端软件开发从业人员最多&#xff0c…

【Open AI】GPT-4o深夜发布:视觉、听觉跨越式升级

北京时间5月14日1点整&#xff0c;OpenAI 召开了首场春季发布会&#xff0c;CTO Mira Murati 在台上和团队用短短不到30分钟的时间&#xff0c;揭开了最新旗舰模型 GPT-4o 的神秘面纱&#xff0c;以及基于 GPT-4o 的 ChatGPT&#xff0c;均为免费使用。 本文内容来自OpenAI网站…

微服务架构:注册中心 Eureka、ZooKeeper、Consul、Nacos的选型对比详解

微服务架构&#xff08;Microservices Architecture&#xff09;是一种基于服务拆分的分布式架构模式&#xff0c;旨在将复杂的单体应用程序拆分为一组更小、更独立的服务单元。这些服务单元可以独立开发、测试、部署&#xff0c;并使用不同的技术栈和编程语言。它们通过轻量级…

外贸业务中的12个“坑”,你踩到了吗?

在竞争激烈的外贸领域&#xff0c;企业在拓展市场的同时&#xff0c;也面临着各种潜在的陷阱和风险。对于外贸公司而言&#xff0c;如何在复杂的交易过程中识破陷阱&#xff0c;防范潜在风险&#xff0c;成为确保企业长远发展的关键一环。 以下是一些外贸企业可能遇到的陷阱&a…

Nebula街机模拟器 Mac移植版(400+游戏roms)汉化版

nebula星云模拟器是电脑上最热门的街机游戏模拟器之一&#xff0c;玩家可以通过这个小巧的模拟器软件进行多款经典街机游戏启动和畅玩&#xff0c;本次移植的包含400多款游戏roms&#xff0c;经典的三国志、三国战纪、拳皇、街霸、合金弹头、1941都包含在内。 下载地址&#xf…

电感式传感器

电感传感器是基于电磁感应原理&#xff0c;将被测非电量&#xff08;如位移、压力、振动等&#xff09;转换为电感量变化的一种结构性传感器。利用自感原理的有自感式传感器&#xff08;可变磁阻式&#xff09;&#xff0c;利用互感原理的有互感式&#xff08;差动变压器式和涡…

aigc在前端中的应用-CodeGeex

前言&#xff1a;目前市场上优秀的智能编程助手有很多&#xff0c;其中以GitHub Copilot&#xff0c;Tabnine为最&#xff0c;但是目前这两款优质的智能编程助手都是需要付费的。如果不选择花费的话&#xff0c;在这里我们向小伙伴推荐免费的智能编程助手codegeex&#xff0c;性…

嵌入式——AStyle格式化工具

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 keil配置快捷键配置 AStyle&#xff08;Artistic Style&#xff09;是一个开源的代码自动格式化工具&#xff0c;可以用于自动化代…

## 23 使用BERT进行文本分类:PyTorch实战指南

文章目录 前言理解BERTPyTorch环境搭建数据准备模型建立训练模型模型评估与应用结论 前言 文本分类是自然语言处理&#xff08;NLP&#xff09;领域的一项基本任务&#xff0c;它的目的是将一个文本序列指派到一个或多个类别中。这项技术被广泛应用于垃圾邮件检测、情感分析、…

月薪20K+的策划人简历应该怎么写?

一般咱们大多数策划在写简历前&#xff0c;都是先直接找模板&#xff0c;然后按照模板的框架直接往里面填内容。 最后草草收场&#xff0c;直接拿去海投简历&#xff0c;结果发现没有拿到任何面试邀约。 策划写简历前的第一件事要梳理自己的能力模型和岗位JD。 因为只有先梳…

做DFMEA最难点,功能分析如何做?——FMEA软件

​免费试用FMEA软件-免费版-SunFMEADFMEA&#xff0c;即设计失效模式与影响分析&#xff0c;是一种在产品设计阶段就预见并预防潜在失效模式的重要工具。然而&#xff0c;在DFMEA的众多步骤中&#xff0c;功能分析无疑是其中的一大难点。它要求我们深入理解产品的各个系统、部件…

Excel 计算多个日期区间的交集中的工作日数

Excel表格有多对起止时间形成了区间组&#xff0c;如B3:C3共12组时间区间 ABCDEF12Ramadan StartsRamadan Ends323-Apr-2022-May-20Date11-Apr-24412-Apr-2111-May-21Date212-Apr-2452-Apr-221-May-22Expected6622-Mar-2320-Apr-23Caculated710-Mar-248-Apr-24828-Feb-2529-Ma…

ArcGIS arcpy代码工具——关于标识码的那些事(查找最大标识码、唯一性检查、重排序、空值赋值)

系列文章目录 ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改 ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片 ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板 ArcGIS arcpy代码工具——定制属性表字段输出表格 ArcGIS arc…

碳纳米管须状触嗅觉多模态融合传感器在皮革奢侈品真伪鉴定下的设计探索

一、设计方案 1.传感器选择 触觉传感器&#xff1a;选择基于碳纳米管&#xff08;CNT&#xff09;聚合物的柔性MEMS触觉微传感器&#xff0c;由于碳纳米管具有高度的灵敏度和选择性、柔韧性&#xff0c;可以作为触觉传感器&#xff0c;检测材料的微观结构和机械特性。嗅觉传感…

防火墙组网

防火墙的职责 控制和防护——在安全策略上即可体现&#xff0c;防火墙可以根据安全策略来抓取流量&#xff0c;之后做出对应的动作。吞吐量表示防火墙同一时间处理的数据量。传统防火墙(包过滤防火墙)&#xff0c;相当于一个严格的规则表&#xff0c;和ACL&#xff08;访问控制…

vue3 ElementUI 日期禁选当日前, 当日后,3天后

今日之前禁用 代码: ( 主要是 :disabledDate“disabledDateFun” ) <el-date-picker v-model"queryForm.selectedDate"type"date"range-separator"-"placeholder"选择日期":disabledDate"disabledDateFun" clearable /&…

性能测试工具—jmeter的基础使用

1.Jmeter三个重要组件 1.1线程组的介绍&#xff1a; 特点&#xff1a; 模拟用户&#xff0c;支持多用户操作多个线程组可以串行执行&#xff0c;也可以并行执行 线程组的分类&#xff1a; setup线程组&#xff1a;前置处理&#xff0c;初始化普通线程组&#xff1a;编写…

echers配置项:数据过多时,折叠数据缩放查看

当数据过多时&#xff0c;如上图所示的时间点&#xff0c;会自动折叠&#xff0c;此时鼠标缩放还不起作用&#xff0c;我们配置如下代码 let option {dataZoom: [{startValue: 05:00}, // 这个值需要跟 第一条 时间数据对应上{type: inside}], }配置后&#xff0c;就可以进行…