USACO--2.1Sorting a Three-Valued Sequence

来源:互联网 发布:ipad pro毛笔字软件 编辑:程序博客网 时间:2024/05/18 00:20

我们可以知道最后排序以后的结果,也就是所有的1,2,3所处的位置;
所以我们可以预先统计1,2,3的数量,然后对于处在1位置的2,3我们先分别到他们各自应该处在的位置,寻找是否有1然后交换,如果没有再到别的位置寻找;处理完1后,我们再统计一下应该是2的位置上有多少3,就可以得到答案了。

代码如下:

/*ID: 15674811LANG: C++TASK: sort3*/#include<iostream>#include<cstdio>#include<cstring>#include<fstream>using namespace std;void swp(int &a,int &b){    int t=a;    a=b;    b=t;}int main(){    ofstream fout("sort3.out");    ifstream fin("sort3.in");    ///ifstream fin("lkl.txt");    int n;    while(fin>>n)    {        int a[1010],num[4];        memset(num,0,sizeof(num));        for(int i=1;i<=n;i++)        {            fin>>a[i];            num[a[i]]++;        }        int cnt=0;        for(int i=1;i<=num[1];i++)        {            if(a[i]==2)            {                cnt++;                int j;                for(j=num[1]+1;j<=num[1]+num[2];j++)                    if(a[j]==1)                    {                       swp(a[i],a[j]);                       break;                    }                if(j>num[1]+num[2])                    for(int d=num[1]+num[2]+1;d<=n;d++)                        if(a[d]==1)                        {                            swp(a[i],a[d]);                            break;                        }            }            if(a[i]==3)            {                cnt++;                int j;                for(j=num[1]+num[2]+1;j<=n;j++)                    if(a[j]==1)                    {                        swp(a[i],a[j]);                        break;                    }                if(j>n)                    for(int d=num[1]+1;d<=num[1]+num[2];d++)                        if(a[d]==1)                        {                            swp(a[d],a[i]);                            break;                        }            }        }        for(int i=num[1]+1;i<=num[1]+num[2];i++)        {            if(a[i]!=2)                cnt++;        }        fout<<cnt<<endl;    }   return 0;}
1 0
原创粉丝点击