華中邀請賽現場賽F題 Seats

2022-05-18 12:09:56 字數 1257 閱讀 2500

解題報告:題目意思應該很清楚,就是有n個人,分別屬於7個班級,然後他們坐成一排,現在要通過相鄰的兩個人做交換,使得所有同乙個班的人都坐到一起,問這個交換的次數最少是多少?

比賽的時候第乙個就是看這題,因為題意簡單,但是看完了一點想法都沒有,所以果斷換了一題,看了題解才知道怎麼做。

首先如果我們知道最後的排列是怎麼樣的,那麼求一共要交換多少次就只要求初始狀態跟最後的排列的逆序對的個數就可以了,然後因為班級最多只有7個,所以可以列舉7個班級的全排列,資料量也不大,一共才5040種情況。然後列舉出排列之後就是求有多少個逆序對了,對於這個有乙個很巧妙的做法,利用到了這個題目中班級數少的特點,就是首先定義乙個

f[i][j]二維陣列,然後將初始的排列掃一遍,f[i][j] 的含義是所有排在   j 班同學前面的   i 班同學的人數,然後在求逆序對的時候只要班級的平方次計算就可以很快得出逆序對的個數,這個原理我想了好久,一開始不懂為什麼這樣可以,唉,還是太菜了啊。。。慢慢領悟吧

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10

using

namespace

std;

11 typedef long

long

int;

12const

int maxn = 100000

;13 int f[10][10],ans,visit[10],que[maxn+5

];14 int judge(int *a)

1522

void dfs(int* a,int

deep)

2328

for(int i = 1;i <= 7;++i)

29if(!visit[i])

3036}37

38int

main()

3955

for(int i = 1;i <= 7;++i)

56 f[i][i] = 0

; 57 ans = 0x7ffffffffff

;58 memset(visit,0,sizeof

(visit));

59 dfs(a,1

);60 printf("

%lld\n

",ans);61}

62return0;

63 }

view code

鞍山邀請賽 部分題

題意 給你n個行星,移動k個行星,繞他們的質心速度變得更大,使得這些行星的速度變得更大,那麼就要使得 i的值更小即可,include include include includeusing namespace std double zb 70100 double sum 70005 double ...

湘潭邀請賽A

哥德 猜想 任一大於2的偶數,都可表示成兩個素數之和。是世界上最著名的未解問題之一,但是下面的反哥德 猜想 任一大於11的奇數,都可表示成兩個合數之和。確很容易證明。定義反哥德 分拆數g n 表示將大於11的奇數n分解為兩個合數之和的方案數。再定義sg n sum 即所有不大於n的奇數的反哥德 分拆...

2018南昌邀請賽網路賽d題

剛開始看到此提時也沒想到dp 但是仔細一思考可以發現確實是 我們只要單獨處理第一位數 剩下的符號和數字看成乙個物品 進行類似揹包的dp即可 首先預處理所有火柴和符號 根據輸入的總火柴進行一次dp即可 include include include includeusing namespace std...