題目大意:給出乙個數列 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...