标题: | 小哼买书 | ||
标签: | 字符串模拟排序字符串处理 | ||
详情: | 小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读哪些书。小哼让每个同学写出一个自己最想读的书的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",n-cnt);
for(int i=1;i<n;i++){
if(a[i]!=a[i+1]) printf("%d ",a[i]);
}
printf("%d\n",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",n-cnt);
for(int i=1;i<n;i++){
if(a[i]!=a[i+1]) printf("%d ",a[i]);
}
printf("%d\n",a[n]);
return 0;
}