牛客 交換 思維 找迴圈節

2021-10-06 12:19:35 字數 863 閱讀 7059

題目大意:給出乙個數列 n ,要求通過交換使其從小到大排序的最小次數

題目分析:第一反應是求逆序對,把之前做過的題目貼過來結果只過了 10% ,靜下心來又讀了一下題,發現這個題目要求交換的兩個數字並不要求相鄰,這就變成了乙個思維題了,可以從迴圈節的角度出發,首先達到最終目標的迴圈節一定有 n 個,因為每個數字都是單獨的乙個迴圈節,思考一下每次交換會發生什麼結果,因為交換的話肯定會使得至少乙個數到達屬於自己的位置,那麼這個數字就單獨形成了乙個迴圈節,換句話說,這個數字從原來的迴圈節中**出來了,再換句話說,每次操作後,一定會使迴圈節的個數增加乙個,那麼這道題目的答案就是 n - 迴圈節的個數 了

**:

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef unsigned long long ull;

const int inf=0x3f3f3f3f;

const int n=1e5+100;

int a[n],n;

bool vis[n];

vectordisc;

void discreate()//離散化

int main()

discreate();

int ans=n;

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

if(!vis[i])

}printf("%d\n",ans);

return 0;

}

Blink(string類 模擬 找迴圈節)

吊燈由n 3 n 16 個燈組成,並排成乙個圓圈。在時間t時,他們會操作在時間t 1時左邊的燈是開著的燈的燈泡的開關。他們會在b個單位的時間裡一直進行這樣的操作 1 b 10 15 請注意,b可能會超過一般的32位整數的範圍。現在已知每乙個燈的初始狀態,請計算出在經過b個單位的時間後,每乙個燈的狀態...

牛客,String of CCPC(思維)

題意 給定乙個長度為n的字串s n s n 只由c,p組成,定義s n 的價值為 s n 中不同的 ccpc 連續子串的個數。現可以向這個子串中插入乙個c,p,但第i次操作,需要消耗i 1的單位價值。求s n 的價值最大為多少。分析 稍微分析一下,可以發現,每次操作,最多只能使s n 的價值 1,假...

牛客 Shortest Path dfs 思維

非常巧妙的轉換。首先我們可以觀察性質,一條邊不可能出現兩次,因為顯然可以被更好的方案替代 之後,每個邊就存在選或者不選兩種情況 如果以子樹的節點為偶數,那麼就不需要,否則需要,做一下dfs即可 includeusing namespace std typedef long long ll const...