杭電1320 Inversion

杭電1320   Inversion
    這道題英文說的是給一個序列,讓你求它的倒置表,是什麼意思呢,看了半天才明白,比如說給你一個序列p(5,9,1,8,2,6,7,4,3),讓你倒置表v,你看,p中的1前面有兩個比它的數,所以v(1)=2;p中的2前面有3個比它大的數,所以v(2)=3;所以v序列就可以得到,是(2,3,6,4,0,2,2,1,0),那麼這題的要求就是給你p序列,你輸出v序列,或者給你v序列,你輸出p序列。
      很明顯,由p序列得到v序列比較簡單對於一個整數i,只要判斷在p序列中它的前面有幾個數比它大,那麼v[i]就等於幾,循環判斷一下就ok了,但是怎麼由v得到p呢,這樣我們不妨設p的初值爲1,2,3,4,5,6,7,8,9,那麼我們可以知道v[1]=2,說明1前面有兩個數比1大,那麼我們就可以把1和3交換位置,3,2,1,4,5,6,7,8,9,v[2]=3,那麼同樣交換得3,5,1,4,2,6,7,8,9。這樣交換下去就可以得到p數列了。那麼程序怎麼實現呢,對於一個數i,我們可以先把p從前向後遍歷,碰到比i大的數進行處理(因爲比i小的數對v是沒有影響的)我們先定義count=0,讓v[i]和count比較,相等的話就記錄p中的這個位置進行修改賦值,不等繼續向後比較,當碰到i自己時,同樣需要判斷,若v[i]與count相等,就不用變換位置了。
題目挺抽的 代碼
#include<iostream>
using namespace std;
int p[100];
int v[100];
int main()
{
    int i, j, n;
    char c;
    while (cin >> n)
    {
        if (n == 0)
            break;
        cin >> c;
        if (c == 'P')
        {
            for (i = 1; i <= n; i++)
            {
                cin >> p[i];
            }
            for (i = 1; i <= n; i++)
            {
                int count = 0;
                for (j = 1; j<i; j++)
                {
                    if (p[i]<p[j])
                        count++;
                }
                v[p[i]] = count;
            }
            for (i = 1; i<n; i++)
            {
                cout << v[i] << ' ';
            }
            cout << v[n] << endl;
        }
        else
        {
            int count = 0;
            int key;
            int k;
            for (i = 1; i <= n; i++)
            {
                cin >> v[i];
                p[i] = i;
            }
            for (i = 1; i <= n; i++)
            {
                count = 0;
                //count1 = 0;
                for (j = 1; j <= n; j++)
                {
                    if (p[j]>=i)//判斷
                    {
                        if (count == v[i])
                        {
                            key = j;
                            break;
                        }
                        count++;
                    }
                }
                for (k = 1; k <= n; k++)//找到i值在p中的位置
                {
                    if (p[k] == i)
                    {
                        break;
                    }
                }
                int temp = p[k];
                p[k] = p[key];
                p[key] = temp;
            }
            for (i = 1; i<n; i++)
            {
                cout << p[i] << ' ';
            }
            cout << p[n] << endl;
        }
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章