杭電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相等,就不用變換位置了。
題目挺抽的 代碼
很明顯,由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;
}