計算客/小教官(xjb)

題目鏈接:https://nanti.jisuanke.com/t/366

題意:中文題誒~

思路: 先通過給出的條件構造一個符合題意的數組(可以是任意一個符合條件的數組,菜雞不會證明;

然後構造的數組和初始序列1, 2, 3, 4...n最少不同元素的個數就是答案;

這點是比較好理解的:題目中給出的b1, b2, ...bm可以是不連續的, 那麼如果每次選擇的m個與初始序列不同位置的元素並且通過一次操作後可以到達初始序列所在位置;

那麼所需代價肯定是最小的,總代價即爲位置不同的元素的數目. 所有情況都可以分解爲m爲 2 或 3的情況的組合,而對於m爲2, 3的情況前面所述顯然是正確的;

那麼剩下的問題就是求目標序列和構造序列最少多少個元素不同了,注意這裏的序列是循環序列;

對於循環序列, 並不確定其開頭元素是那個,枚舉其開頭元素的話,時間復雜度爲O(n^2), 顯然會tle;事實上也並不需要那樣做,可以先求最多有多少個元素與初始序列位置相同;

再用n減一下即可. 注意這裏的初始序列是一個特殊的序列,爲1, 2, 3, 4...n, 那麼可以用(a[i]-i+n)%n表示其相對序列,相對序列號相同的元素一定存在某個開頭元素使其位置與

初始序列是相同的, 所以只要找出最多的相對序列號相同的元素數目即爲對多與初始序列位置相同的元素的個數;

注意還要逆時針再計算一邊相對序列號相同的最多元素數目;

代碼:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 using namespace std;
 5
 6 const int MAXN=5e4+10;
 7 int a[MAXN], vis[MAXN];
 8 struct node{
 9     int f, s;
10 }gg[MAXN];
11
12 int main(void){
13     int n;
14     scanf("%d", &n);
15     for(int i=1; i<=n; i++){
16         scanf("%d%d", &gg[i].f, &gg[i].s);
17     }
18     a[1]=1;
19     vis[1]=true;
20     int indx=1, cnt=1;
21     while(1){//構造序列
22         int cc=gg[cnt].f;
23         if(vis[cc]){
24             cc=gg[cnt].s;
25             if(vis[cc]) break;
26         }
27         vis[cc]=true;
28         a[++indx]=cc;
29         cnt=cc;
30     }
31     if(indx<n){
32         cout << -1 << endl;
33         return 0;
34     }
35     indx=0;
36     while(indx<n){//變成下標從0開始,便宜後面計算
37         a[indx]=a[indx+1];
38         indx++;
39     }
40     memset(vis, 0, sizeof(vis));
41     int cc=0;
42     for(int i=0; i<n; i++){//順時針計算相對序號
43         int temp=(n+a[i]-i)%n;
44         vis[temp]++;
45     }
46     for(int i=0; i<n; i++){
47         cc=max(cc, vis[i]);
48     }
49     memset(vis, 0, sizeof(vis));
50     for(int i=0; i<n; i++){//逆時針計算相對序號
51         int temp=(n+a[n-1-i]-i)%n;
52         vis[temp]++;
53     }
54     for(int i=0; i<n; i++){
55         cc=max(cc, vis[i]);
56     }
57     printf("%d\n", n-cc);
58     return 0;
59 }

时间: 2024-10-27 09:30:31

計算客/小教官(xjb)的相关文章

計算客/节食的限制(01背包)

題目鏈接: https://nanti.jisuanke.com/t/227 題意:中文題誒~ 思路:01背包 類似的題: http://www.cnblogs.com/geloutingyu/p/6279279.html 用dp[i][j]表示到地 i 個數能得到的不大於 j 的最大的數, 顯然有 dp[i-1][j-a[i]]+a[i] 爲選擇第 i 個與元素能得到的不大於 j 的最大的數, 那麼有動態轉移方程: if(j>=a[i]) dp[i][j]=max(dp[i-1][j], dp

Delphi APP 開發入門(三)簡易計算機

Delphi APP 開發入門(三)簡易計算機 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次數:6823 發表時間:2014/05/20 tags: 行動開發 教學 App Delphi XE6 Android iOS 上週大家學會了設定Android/iOS編譯環境以及寫出第一個Hello World之後,我們今天要來寫第一隻APP簡易計算機. 新增一個空白的APP專案後,我們在畫面上新增一個Edi

透過 bc 計算 pi

echo "scale=${num}; 4*a(1)" | bc -lq例如: echo "scale=5000; 4*a(1)" | bc -lq 4*a(1) 是 bc 主動提供的一個計算 pi 的函數,至於 scale 就是要 bc 計算幾個小數點下位數的意思.當 scale 的數值越大, 代表 pi 要被計算的越精確, 當然用掉的時間就會越多!可以以此来测试cpu的性能. 转自: http://linux.vbird.org/linux_basic/0340

各種日期時間計算

各種日期時間計算 //改變日期format string startStr = start.ToString("yyyy-MM-dd HH:mm:ss"); DateTime dt = Convert.ToDateTime(startStr);//轉回DateTime P.S format 大小寫意義不同: MM=month, mm=Minutes, HH=24hours, hh=12hours //日期時間相加減 DateTime start = Convert.ToDateTime

計蒜客/數正方形(dp)

題目鏈接:https://nanti.jisuanke.com/t/44 題意:中文題誒~ 思路: 用dp[i][j]存儲以(i, j)爲左上定點的最大正方形變長,從右下角網左上角一次計算所有頂點: 通過畫圖不難分析出動態專題方程式爲: dp[i][j]=min(dp[i+1][j+1], dp[i+1][j], dp[i][j+1]) + 1 需要注意的是如何累計所有變長的正方形數目, 對於坐標(i, j), 從2~dp[i][j]依次累加一次即可: 代碼: 1 #include <iostr

計算兩組經緯度座標間的距離

/** * 計算兩組經緯度座標間的距離 * params:lat1緯度1,lng1經度1,lat2緯度2,lng2經度2,len_type(1:m|2:km); * Echo GetDistance($lat1,$lng1,$lat2,$lng2).'米'; */ function GetDistance($lat1,$lng1,$lat2,$lng2,$len_type=1,$decimal=2){ $EARTH_RADIUS=6378.137; //地球半徑,假設地球是規則的球體 $PI=3

擠出機步進馬達的 Steps per Unit 該如何計算?

擠出機步進馬達的 Steps per Unit 該如何計算? 這邊 Steps per Unit 指的是塑料往前推進1mm,步進馬達須要走幾步.依此定義,可知計算方式可以用 步進馬達轉一圈需要的步數 除以 步進馬達轉一圈塑料往前推的距離 來求解. 步進馬達轉一圈需要的步數這樣算: (360/馬達一步走幾度)*微步進細分數 馬達轉一圈塑料前進的距離這樣算: 2 * pi * (送料齒輪半徑 + 塑料半徑 - 齒痕深度)

計算機架構圖

一臺計算機能夠正常運行:有以下結構組成 從下到上: 第一:硬件 第二:Kernel 內核,即所謂操作系統 第三:庫,公共系統調用的資源,API,應用程序接口 第四:Shell,與人交互的shell,不需直接與內核或硬件打交道!如下圖

配置凍結庫存是否參加MRP計算及PO的相關設置

SPRO->生產->物料需求計劃->計劃->MRP計算->庫存->定義轉移庫存/凍結庫存/有限庫存的可用性 2.交貨完成 SPRO->物料管理->庫存管理和實際庫存->收貨->設置交貨完成標誌 標記完成了的,是不會參與MRP計算的,但是還可以繼續收貨的 3.設置容差 後台設置:SPRO->物料管理->庫存掛家裡和實際庫存->收貨->設置容差限制 4.退貨PO A.自動建立採購訂單 後台設置:SPRO->物料管理-&g