2022UPC新生赛4-题解

题解的排版顺序是按照题目的提交数量由少到多写的。

思路仅供参考,代码大家一定要自己敲一遍,不可直接ctrl+c,ctrl+v

问题J:平方因子

题目描述

多多有一些正整数n,n+1,n+2,...m,如 n=3,m=9 时,多多有3,4,5,6,7,8,9 七个数。 
多多不喜欢平方因子,如 4,9,16,25 都是平方因子,而1不算平方因子,多多想知道他的这些数当中有多少数中不包含平方因子?在 3~9 这些数中包含平方因子的数有4,8,9 三个数,不包含平方因子的数是 3,5,6,7 四个数。

输入

输入一行,两个数n,m(1<=n,m<=1000000)

输出

输出一个整数表示答案。

输入:

1 10

输出:

7

思路:

这个题我们可以直接暴力循环来跑,但是不能太暴力,需要优雅的暴力。因为1不算做平方数,所以我们使i从2开始直接到根号y遍历(这样是为了遍历平方因子的),然后在遍历一个数j,这个数另一个因子使得j*i*i在x和y之间。最后在遍历完成标记好之后,我们就可以统计没有被标记的数字(没有标记的就是没有平方因子的数)

主要代码:

int sums(int x,int y)
{
	int cnt = 0;
	for(int i = 2;i*i <= y;i++)
		//把i^2的倍数遍历出来
		//初始和终止条件就是j*(i^2)的倍数要在x和y之间
		for(int j = x/i/i;j*i*i <= y;j++)
				vis[j*i*i] = 1;
	for(int i = x;i <= y;i++)
		if(!vis[i])
			cnt++;//找没有被更新(筛)到的数
	return cnt;
}

问题D:计时器

题目描述

运动场修好后,体艺节马上要开始了。体艺节上要用N个计时器,每个计时器是一个中间显示秒数的方形电子表。如下图是显示5秒和201秒的两个计时器:

   

为了检查这些计时器的质量,晨晨创新地开发设计出一个新游戏,鼓动了M个同学报名参加。游戏开始时她把这N个计时器排成一行,开始时间都是0。然后她对这M个同学每个人发一条命令:
把第si个到第ti个计时器上时间都加1秒。
M个同学完成指令后,N个计时器上时间几乎都变了。晨晨要通过编计算机程序来计算所有计时器上的数字长度(位数)总和。例如下面N=3个计时器的数字长度分别是1、3、2,长度和是6(=1+3+2)。

   

输入

第1行:2个正整数N和M。(N,M均为大于0小于200000的整数)
下面有M行:每行2个整数s和t。(0<s<t<=N)

输出

 一整数,表示N个数总位数长度。

输入:

5 10

1 3

2 4

2 3

1 3

1 4

1 4

1 4

2 4

2 4

2 4

输出:

7

思路:

这道题如果使用模拟的话,肯定超时。所以我们这个题就需要使用一个差分数组来记录变化,最后使用前缀和计算出各计时器的时间。

主要代码:

int cf[N];//差分数组,记录事情变化 
int sum[N];//差分数组的前缀和 
int main()
{
	cin >> n >> m;
	for(int i = 0;i < m;i++){
		cin >> x >> y;
		//差分数组的使用 
		cf[x]++;
		cf[y+1]--;
	}
	//差分的前缀和 
	for(int i = 1;i <= n;i++){
		sum[i] = sum[i-1]+cf[i];
	}
	int cnt = 0;
	//统计显示牌上的位数的 
	cout << cnt; 
}

问题 H: 朋友圈

题目描述

多多很喜欢发朋友圈,至今他已经发了N条朋友圈,并且他的第i条朋友圈获得了ci次点赞。多多听说有一个h指数来衡量朋友圈的质量,h指数是指有至少h条获得了不少于h次点赞的朋友圈的最大整数h。例如,有4条朋友圈获得的点赞次数为 (1,100,2,3),则h指数为2,如果点赞次数为 (1,100,3,3),则h指数为3。
多多想知道自己的h指数是多少。

输入

第一行为一个整数N(1<=N<=100000)。
第二行为N个整数,第i个数表示第i条朋友圈获得的点赞次数ci(0<=ci<=100000)。

输出

输出一个整数,表示多多的h指数。

输入:

4

1 100 2 3

输出:

2

思路:

这个题其实不算太难,但是我看提交的数量挺少的。这个题我们需要满足条件的最大值,那我们先最这个数组进行降序排序,这样之后,我们就可以看如果a[i]的值大于i,那么就满足大于i的数量至少为i,那么我找到第一个不满足条件的i,那么i-1就是我要找的最大值。

主要代码

int main()
{
	int n;
	cin >> n;
	for(int i = 1;i <= n;i++){
		cin >> a[i];
	}
	//降序排序 
	sort(a+1,a+1+n,cmp);
	bool flag = 0;
	for(int i = 1;i <= n;i++){
		if(a[i] < i){//找到第一个不满足条件的i 
			cout << i-1 ;
			flag = 1;//标记一下,因为有可能所有的数都满足了,那样我们就没有输出了 
			break;
		}
	}
	if(!flag)
		cout << n;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值