首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

又来了~算法排序OK的进来帮帮忙啊有分拿

2012-11-06 
又来求救了~~算法排序OK的进来帮帮忙啊!!有分拿!在学校的在线测试系统ACM遇到了一道题了,提交后结果《答案5

又来求救了~~算法排序OK的进来帮帮忙啊!!有分拿!
在学校的在线测试系统ACM遇到了一道题了,提交后结果《答案50%错误》,来求救了~~下面是题目和我的代码~~如果有更好的方法更快的方法也可以发来看看,思路也好,题目的意思是输入给数组,然后给数组的数排名次,从小到大,相同的数字一样名次,我的代码也在下面~~


题目描述: 
输入一个数组的值,求出各个值从小到大排序后的次序。并且要求相同的数据其序号是相同的



输入: 
输入有多组数据。
每组输入的第一个数为数组的长度n(1<=n<=10000),后面的数为数组中的值,以空格分割。



输出: 
各输入的值按从小到大排列的次序(最后一个数字后面没有空格)。


样例输入
4
-3 75 12 -3
样例输出
1 3 2 1


[code=C/C++][/code]
#include<iostream>
using namespace std;
int main()
{
int n,a[10000],b[10000],x=0,temp;
cin>>n;
while(x<n)
{
cin>>a[x];
b[x]=a[x];
x++;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n-1;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
if(a[j]==a[j+1])
{
a[j+1]=2147483646;
}
}
}
for(int i2=0;i2<n;i2++)
{
for(int j2=0;j2<n-1;j2++)
{
if(b[i2]==a[j2])
{
if(i2==0)
cout<<j2+1;
else
cout<<" "<<j2+1;
}
}
}
return 0;
}
[code=C/C++][/code]

[解决办法]

C/C++ code
#include <iostream>#include <algorithm>using namespace std;struct Node {    int num;    int oldIndex;    int newIndex;}NOdeArray[10000];bool cmpNum(Node x,Node y){            return x.num<y.num;} bool cmpOldIndex(Node x,Node y){           return x.oldIndex<y.oldIndex;} int main(){    int n,m;    cin>>n;    for (int i = 0 ;i < n; i++)    {        cin>>m;        NOdeArray[i].oldIndex = i;        NOdeArray[i].num = m;    }    sort(NOdeArray,NOdeArray+n,cmpNum);        int index = 1;    NOdeArray[0].newIndex = index;    for (int i = 1 ;i < n; i++)    {                      if (NOdeArray[i-1].num == NOdeArray[i].num)        {            NOdeArray[i].newIndex = NOdeArray[i-1].newIndex;        }else   NOdeArray[i].newIndex = ++index;              }        sort(NOdeArray,NOdeArray+n,cmpOldIndex);    for (int i = 0 ;i < n; i++)    {        cout<<NOdeArray[i].newIndex;        if(i != n-1) cout<<" ";    }    return 0;}
[解决办法]
又是我~呵呵

做ACM,尽可能多用现有的工具来减少编码量,否则累死你。最简单易用的就属STL了,强大,易学,易用。

基本思路应该是,排序,查序

所以:
C/C++ code
#include <iostream>#include <vector>#include <algorithm>#include <map>;using namespace std;int main() {    int count;    cin>>count;    vector<int> nums(count);    for (int i=0; i<count; ++i) {        cin>>nums[i];    }    // 保留一份拷贝,以备后面查顺序用    vector<int> originNums = nums;    // 对原始数据进行排序    sort(nums.begin(), nums.end());    // 去除数据中重复的内容    vector<int>::iterator newEnd = unique(nums.begin(), nums.end());    nums.erase(newEnd, nums.end());    // 对排序后数据进行序号标识    map<int,int> orders;    int order = 1;    for (vector<int>::iterator it=nums.begin(); it!=nums.end(); ++it) {        orders[*it] = order++;    }    // 利用已序标识,输出原始数据的序号    for (vector<int>::iterator it=originNums.begin(); it!=originNums.end(); ++it) {        cout<<orders[*it]<<' ';    }    return 0;}
[解决办法]
C/C++ code
#include <stdio.h>#include <algorithm>using namespace std;struct node{    int data;    int pos;    int order;};node p[10000];bool cmp1(const node &a,const node &b){    return a.data<b.data;}bool cmp2(const node&a,const node &b){    return a.pos<b.pos;}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        for(int i=0;i<n;i++)        {            scanf("%d",&p[i].data);            p[i].pos=i;        }        sort(p,p+n,cmp1);        int order=1;        p[0].order=order++;        for(int i=1;i<n;i++)        {            if(p[i].data==p[i-1].data)                p[i].order=p[i-1].order;            else                p[i].order=order++;        }        sort(p,p+n,cmp2);        for(int i=0;i<n-1;i++)            printf("%d ",p[i].order);        printf("%d\n",p[n-1].order);    }} 

热点排行