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); // 序列本身长度加1if(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的牛的个数多余实际牛的个数,就可以返回trueint cnt = 1,cur = 0,next=1;//cur是当前牛编号,next是下一只牛的编号,cnt是用来计数的while(next<n){next++;//指向下一只牛if(a[next]-a[cur]>=m){//当前编号牛的位置与下一编号牛的位置只要大于mcnt++;//满足条件的牛的个数加1cur=next;//把当前牛调整为next}}if(cnt>=c)return true;//只要相隔m的牛的个数多余实际牛的个数,就可以返回trueelse 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),因为两头都可以取值,蓝哥思考一下为什么是牛的个数-1while(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,做一输出leftreturn 0;
}

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;int a[100], n, c;// 方法函数:判断是否能在最小间隔为m的情况下放置至少c个摊位
bool fun(int m) { // 只要相隔m的牛的个数多余实际牛的个数,就可以返回trueint cnt = 1, cur = 0, next = 1; // 初始化计数器、当前牛位置和下一个牛位置while (next < n) {next++; // 移动到下一个牛的位置if (a[next] - a[cur] >= m) { // 检查当前牛与下一牛之间距离是否大于等于mcnt++; // 计数器加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;
}

 

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

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

相关文章

【AI+agent智能助手】使用Dify新手小白也能分分钟构建属于自己的 AI 原生应用

最近有读者看了我这篇文章 【人工智能】字节版GPTs「扣子」coze免费使用chatGPT4模型操作步骤 &#xff0c; 私信我有没有本地私有化 智能体推荐。 这里推荐一款&#xff0c; Dify支持私有化部署&#xff0c;新手小白也能分分钟构建属于自己的 AI 原生应用。 官方地址&#…

异地组网群晖不能访问怎么办?

在日常使用群晖网络储存设备时&#xff0c;我们常常会遇到无法访问的情况&#xff0c;特别是在异地组网时。这个问题很常见&#xff0c;但也很让人困扰。本文将针对异地组网群晖无法访问的问题进行详细解答和分析。 异地组网的问题 在异地组网中&#xff0c;群晖设备无法访问的…

STM32时钟系统和时钟树

目录 STM32时钟系统 认识时钟树 什么是时钟 认识时钟树(F407) 配置系统时钟 系统时钟配置步骤 外设时钟使能和失能 sys_stm32_clock_init函数(F4) 时钟配置一般步骤 System文件夹_时钟系统工作原理 System文件夹介绍 Sys文件介绍 Delay文件介绍 Systic工作原理 S…

【SQL】SQL常见面试题总结(1)

目录 1、检索数据1.1、从 Customers 表中检索所有的 ID1.2、检索并列出已订购产品的清单1.2、检索所有列 2、排序检索数据2.1、检索顾客名称并且排序2.2、对顾客 ID 和日期排序2.3、按照数量和价格排序2.4、检查 SQL 语句 3、过滤数据3.1、返回固定价格的产品3.2、返回产品并且…

面试题库-项目

1.项目主要实现了哪些功能&#xff1f; 本项目是专门为校园食堂窗口定制的一款软件产品&#xff0c;包括系统管理后台和客户端两部分。其中系统管理后台主要提供给食堂内部员工使用&#xff0c;可以对餐厅的菜品、套餐、订单、员工等进行管理维护。客户端主要提供给学生及校职…

【简单介绍下在Ubuntu中如何设置中文输入法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

STM32手写寄存器的方式实现点亮LED灯

这次是从头开始学习STM32&#xff0c;看野火的视频开始学习&#xff0c;感觉需要记录的时候就要记录一下学习的心得。野火视频学习的老师讲的还是很到位的&#xff0c;能够学习到很多的细节之处&#xff0c;有时会感觉很啰嗦&#xff0c;但是不得不说确实很详细&#xff0c;只有…

python批量生成防伪识别二维码

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结 一.前言 二维码(QR Code)是一种矩阵条码技术,它使用黑白矩形图案来表示二进制数据,这些矩形图案可以被设备扫描并解读。二维码可以被用来存储

macOS Ventura 13如何设置定时重启(命令行)

文章目录 macOS Ventura 13如何设置定时重启(命令行)前言具体设置步骤及命令解释其他 macOS Ventura 13如何设置定时重启(命令行) 前言 由于升级 macOS 13 Ventura 之后&#xff0c;之前在节能里面通过鼠标点击设置开机关机的方法不能用了&#xff0c;现在只能用命令设置开机…

设计模式:外观模式(Facade)

设计模式&#xff1a;外观模式&#xff08;Facade&#xff09; 设计模式&#xff1a;外观模式&#xff08;Facade&#xff09;模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景模式扩展参考 设计模式&#xff1…

英伟达发布 VILA 视觉语言模型,实现多图像推理、增强型上下文学习,性能超越 LLaVA-1.5

前言 近年来&#xff0c;大型语言模型 (LLM) 的发展取得了显著的成果&#xff0c;并逐渐应用于多模态领域&#xff0c;例如视觉语言模型 (VLM)。VLM 旨在将 LLM 的强大能力扩展到视觉领域&#xff0c;使其能够理解和处理图像和文本信息&#xff0c;并完成诸如视觉问答、图像描…

001_PyQt简介

本系列面向零基础小白&#xff0c;从零开始到Pyqt 进行项目实战。 什么叫从零开始&#xff1f;从软件安装、环境配置开始。 不跳过一个细节&#xff0c;不漏掉一行代码&#xff0c;不省略一个例图。 PyQt作为一个强大的工具包&#xff0c;成功地将脚本语言python和QT库融合到…