提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
今天在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站看贪心算法呜呜呜