今天学校运动会,累了,不想写太多。。。
感谢博客http://blog.csdn.net/doyouseeman/article/details/51154142
正题
一、何为离散化?
有一个数组,数太大了,存不下。这时可以只储存数组中的每个数是第几大,节省大量空间和时间。
注意:数组中可能会有相同的数
比如:
7 1 10 -1 -1 0 10000 9999
离散化后是:
4 5 1 1 3 7 6
明白了的话,接着往后看。
二、离散化的基本方法
将数组排序,记录每个数是第几大,然后再赋值。需要开第二个数组,而且写起来很麻烦。
三、离散化黑科技
建议下面的代码当模板背下来就好了,看不懂没关系:
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int n,a[1005],date[1005]; void lsh(int *x) { int i; for(i=1;i<=n;i++) date[i]=a[i]; sort(date+1,date+n+1);//排序是必须的 int r=unique(date+1,date+n+1)-date-1;//神奇的黑科技,针对date数组去重 for(i=1;i<=n;i++) a[i]=lower_bound(date+1,date+1+r,x[i])-date; //神奇的黑科技,找到a[i]在date中的位置并赋值 } int main() { int i; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); lsh(a);//对数组a进行离散化 for(i=1;i<=n;i++) printf("%d",a[i]); return 0; }
嗯,讲完了。
~祝大家编程顺利~