今天是一个值得纪念的日子;
荀彧同学刷完了oj上第一页所有题;
第99道题,令荀彧同学感触颇深,虽然并不是独立完成的(借鉴了连浩明同学的代码),但是还是有必要整合一下;
老规矩,先把题目放上来:
题目描述
在使用离散化方法编程时,通常要知道每个数排序后的编号(rank值)。相同的数对应一个编号。
rank[i]表示第i个数在所有数里的排名。
输入格式
第1行:一个整数N,范围在[1…100000]。 第2行:有N个整数,每个数都是int范围的。注意:可能有相同整数。
输出格式
依次输出每个数的排名。
样例数据
input
5
8 2 6 9 2
output
3 1 2 4 1
数据规模与约定
保证1<=N<=100000 每个数不超过1000000
时间限制:1s1s
空间限制:256MB256MB
好啦,现在来讲一讲荀彧同学的思路:
毕竟是一道数组排序题嘛,那就先把数组放进来;
于是想用函数的荀彧同学就用了一个void型的函数,叫做cina,意思是插入a数组;
然后排序排一下,就用了一个很水很水的void函数,叫paixu,只有一行sort函数的代码;
接下来对排序后的数组进行标记;
最后输出;
放代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[1000100]={},b[1000100]={},c[1000100]={},d=1;
void cina()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
}
void paixu()
{
sort(a+1,a+n+1);
}
void biaoji()
{
for(int i=1;i<=n-1;i++)
if(a[i+1]!=a[i])
{
c[a[i]]=d;
d++;
}
c[a[n]]=d;
}
void couta()
{
for(int i=1;i<=n-1;i++)
cout<<c[b[i]]<<' ';
cout<<c[b[n]];
}
int main()
{
cina();
paixu();
biaoji();
couta();
return 0;
}
using namespace std;
int n,a[1000100]={},b[1000100]={},c[1000100]={},d=1;
void cina()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
}
void paixu()
{
sort(a+1,a+n+1);
}
void biaoji()
{
for(int i=1;i<=n-1;i++)
if(a[i+1]!=a[i])
{
c[a[i]]=d;
d++;
}
c[a[n]]=d;
}
void couta()
{
for(int i=1;i<=n-1;i++)
cout<<c[b[i]]<<' ';
cout<<c[b[n]];
}
int main()
{
cina();
paixu();
biaoji();
couta();
return 0;
}
今天终于决定了要尝试一下信息学竞赛,以后少划水,多刷题;
全文终。