ACM实训冲刺第八天

2024-05-16 06:28
文章标签 实训 acm 冲刺 第八天

本文主要是介绍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;
}

 

这篇关于ACM实训冲刺第八天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/994122

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

研一实训总结

说长不长说短不短的一个月,从最开始的激动到期间,要中期要兼顾找实习准备笔试面试的焦虑,再到最后一周的加班加点和总结,收获和感触还是蛮多的。 首先,这一个月让我更加全面的认知了完成一个从无到有项目的过程,激发了我对自己工程师职业生涯的向往和对自己有了更广的除了编码以外的要求。 我一直是一个结果导向和追求效率的人,所以在团队合作过程中我们也经历了最开始的不知所措,到争执,再到主动配合和贡献,这个过

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

我们依旧在追梦的路上-山东省第六届ACM比赛总结

这场比赛从结果而言达到了预期(金牌),从过程而言和我的预期相差甚远(打的太乱,个人发挥很差),还好关键时刻队友抗住压力,负责后果真的不堪设想。 热身赛 热身赛纯粹测机器的,先把A,B,C草草水过(A题小写x打成大写的也是醉了),我和老高开始各种测机器,long long不出所料是lld的,试了一下除0和数组越界的re问题,发现没有re,只有wa(甚至数组越界还AC了),至于栈深的话也没过多追

2024国赛论文拿奖快对照这几点及评阅要点,勿踩雷区!(国赛最后冲刺,提高获奖概率)

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 2024“高教社杯”全国大学生数学建模竞赛已过去第三个夜晚,小伙伴们都累了没有,如果感到思维滞涩,别忘了稍作休息,放松一下自己,准备迎接国赛非常重要的收尾阶段——论文。 国赛这几天的努力最后都

ACM东北地区程序设计大赛

不得不说随着参赛级别的提高,题目真的是越来越难啊,不过队长真是给力啊,在我们三个共同努力之下拿下了地区赛三等奖,哈哈我们可是大一唯一一只获奖队,终于在这次比赛打败了田大神。。。大神是失手了,俺和他差距还是挺大的。。。队友陈彤马上要去服兵役了,他说这是我们送给他最好的离别礼物,希望那家伙在部队好好干,以后谁干揍我!!!东北地区赛结束后,今年已经估计没机会参加亚洲区比赛了,赶紧补高数和线数啊!!别挂了

ACM比赛中如何加速c++的输入输出?如何使cin速度与scanf速度相当?什么是最快的输入输出方法?

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中

2014年ACM/ICPC亚洲区现场赛广州赛区总结

本来不想提这件事的,后来学姐找我谈心时提到这件事,我突然意识到在这件事情上我错了一次,明明答应的去参加这场比赛,最后临时决定不去......其实中间有很多很多原因 1:我和tyh,sxk临时不去主要是广州太远,我们身上money不够,呵呵。。。别笑我们,你以为我们是高富帅啊,去一趟广州消费要2个月的生活费,奖学金又没发,你让我找我妈要她辛辛苦苦挣来的工资吗?!从哈尔滨到广州单来回的火车票每个人就

两个月冲刺软考——逻辑地址与物理地址的转换(例题+讲解);文件类型的考点

1.已知计算机系统页面大小和进程的逻辑地址,根据页面变换表(页号-物理块号),求变换后的物理地址。 首先介绍几个公式: 逻辑地址 = 页号 + 页内地址 (默认为32机位) 物理地址 = 物理块号 + 物理地址的页内地址 其中:页内地址 = 物理地址的页内地址 解题:由于页面大小为4K,即4K=2的12次方,占0~11位;也就是页内地址有12位,故十六进制数中的C28是页内地址,那