思维转换的重要性

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

今天在vjudge中做了有两题,感觉自己还是有点懵懵的状态,不太能进入到算法的转换中。


提示:以下是本篇文章正文内容,下面案例可供参考

一、查询数组元素出现次数

蒜头君手上有个长度为 nn 的数组 AA。由于数组实在太大了,所以蒜头君也不知道数组里面有什么数字,所以蒜头君会经常询问在数组 AA 中,等于 xx 的数字有多少个?

输入格式

第一行输入两个整数 nn 和 mm,分别表示数组的长度和查询的次数。

接.下来一行有 nn 个整数 a_iai​。

接下来 mm 行,每行有 11 个整数 xx,表示蒜头君询问的整数。

输出格式

对于每次查询,输出一个整数,表示数组 AA 中x出现的次数

 错误思想:1:首先昨天在看到此题时,第一反应是:暴力写,当然,超时了,不可避免,于是我想走捷径,用python,然后第二个错误思想来了

2:首先还是想到了直接用字典来写,很不幸,又超时了,然后又去了解了内置函数counter,同样的,还是超时

正确思想:这时候,经过了旁人的提醒,我拿出来了在垫桌角的啊哈算法,拾起了我一个月之前看到的桶排序,book数组,很快解决

#include<stdio.h>
int main()
{
	int book[10000000],a,b,i,m,n;
	scanf("%d%d",&a,&b);
	for (i=0;i<a;i++)
	{
		scanf("%d",&n);
		book[n]++;
	}
	for(i=0;i<b;i++)
	{
		scanf("%d",&m);
		printf("%d\n",book[m]);
	}
	return 0;

二.学会避重就轻

可达鸭小学的大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
马路上有一些区域要用来建地铁,这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

Input

输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

Output

输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目

错误思想:其实也不能算错误思想吧,这一题大眼一看我去,这不就是妥妥的贪心思想吗?奈何啊,我不是很懂~就被搁置住了,然后看了一眼别人的,好家伙,就一简单的book数组就解决,甚至不用book【i】++,直接book【i】=1就解决了关键问题,但是一定要注意细节,比如:数组多开10,printf放在for循环外部......


#include<stdio.h>
#include<string.h> 
int main()
{
	int l,i,m;
	int c=0;
	scanf("%d%d",&l,&m);
	int k[1000010]={0};
	int a[100],b[100];
	for(i=0;i<m;i++)
	{
		scanf("%d%d",&a[i],&b[i]);
		for(int j=a[i];j<b[i]+1;j++)
		{
		
			k[j]=1;
		}
	}
	for(i=0;i<l+1;i++)
	{
		if (k[i]==1)
		{
			c=c+1;
	
		}
}
		printf("%d",l-c+1);
		return 0;
	
 } 

总结:我现在就滚去b站看贪心算法呜呜呜

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值