标题: | 小哼买书 | ||
标签: | 字符串模拟排序字符串处理 | ||
详情: | 小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读哪些书。小哼让每个同学写出一个自己最想读的书的ISBN号(你知道吗?每本书都有唯一的ISBN号,不信话你去找本书翻到背面看看)。当然有一些好书会有很多同学都喜欢,这样就会收集到很多重复的ISBN号。小哼需要去掉其中重复的ISBN号,即每个ISBN号只保留一个,也就说同样的书只买一本(学校真是够抠门的)。然后再把这些ISBN号从小到大排序,小哼将按照排序好的ISBN号去书店去买书。请你协助小哼完成“去重”与“排序”的工作。 | ||
输入格式: | 输入有2行,第1行为一个正整数,表示有n个同学参与调查(n<=100)。第2行有n个用空格隔开的正整数,为每本图书的ISBN号(假设图书的ISBN号在1~1000之间)。 | ||
输出格式: | 输出也是2行,第1行为一个正整数k,表示需要买多少本书。第2行为k个用空格隔开的正整数,为从小到大已排好序的需要购买的图书ISBN号。 | ||
提示: | 改编自全国青少年信息学奥林匹克联赛(NOIP2006)普及组第一题《明明的随机数》。 | ||
限制: | 每个测试点1秒 | ||
样例: |
|
题解1:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <map> using namespace std; void quickSort(int a[],int L,int R){//快速排序-------------------------模板1 if(L>R) return; int i=L,j=R; int temp=a[L];//基准数为数组最左边的数 while(i!=j){ while(a[j]>=temp&&i<j)//先从右边开始找第一个小于基准数的数 j--; while(a[i]<=temp&&i<j)//再从左往右找第一个大于基准数的数 i++; if(i<j)//如果i和j没有相遇则交换他们 swap(a[i],a[j]); } swap(a[L],a[i]);//基准数归位 quickSort(a,L,i-1);//递归处理左边 quickSort(a,i+1,R);//递归处理右边 } int main() { int n,a[105]; scanf("%d",&n); int cnt=0; for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } quickSort(a,1,n); for(int i=1;i<n;i++){ if(a[i]==a[i+1]) cnt++; } printf("%d ",n-cnt); for(int i=1;i<n;i++){ if(a[i]!=a[i+1]) printf("%d ",a[i]); } printf("%d ",a[n]); return 0; }
题解2:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <map> using namespace std; const int maxn=105; int Partition(int a[],int L,int R){//以a[R]作为划分值 int less=L-1;//小于划分值的区域 int more=R;//大于划分值的区域 while(L<more){ if(a[L]<a[R]){//从左往右如果找到小于划分值的数,找到之后小于区长度+1,L指针往后移一位 swap(a[++less],a[L++]); }else if(a[L]>a[R]){//从左往右如果找到大于划分值的数,找到之后大于区长度+1,L指针不动 swap(a[L],a[--more]); }else L++;//相同不作处理 } swap(a[more],a[R]); return L; } void quickSort(int a[],int L,int R){//快速排序---------------------------------------模板2 int p=Partition(a,L,R);//取得划分值的位置 if(L<R){ quickSort(a,L,p-1);//递归处理左边 quickSort(a,p+1,R);//递归处理右边 } } int main() { int a[maxn],n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } quickSort(a,1,n); int cnt=0; for(int i=1;i<n;i++){ if(a[i]==a[i+1]) cnt++; } printf("%d ",n-cnt); for(int i=1;i<n;i++){ if(a[i]!=a[i+1]) printf("%d ",a[i]); } printf("%d ",a[n]); return 0; }