CF 1008 規律水題

2021-08-31 13:55:34 字數 971 閱讀 4274

原題連線:

題意:給出n個數,要求重新將這些數排列,求出新排列的數列對應位置比初始數列大的數的個數。

題解:一種方法是貪心,sort一遍,然後對於每個數 a[i] ,用乙個pos指標從前往後掃,每掃到連續的小於 a[i] 的數答案就加一。

不過時間複雜度有點高。

另一種方法就是根據樣例猜規律(後面會給出證明)。

看到樣例

7

10 1 1 1 5 5 3 輸出 :4

5

1 1 1 1 1 輸出: 0

想到可能答案就是 n - 最多相同的數的個數。

證明:(可能有點難理解,看不懂就算了,會第一種就好了) 假設最多相同的數(記為a)的個數 為 x,那麼其他所有數個數總和為 n-x; 那麼排序後的數列可以形象地表示為 a x b (a表示小於a的數的個數,b表示大於a的數的個數)。

所有的x中,一部分x可以和a匹配,剩餘的x肯定都比b小,所以所有的b都可以和x匹配,因此答案就是a+b,其實就是 n-x;

比如樣例

1 4 4 4 5 3 5

排序後:1 3 4 4 4 5 5,那麼x = 3,a = 2,b = 2;

一部分x與a匹配

1 3 4 4 4 5 5

4 4然後把所有b移到匹配後的數後面,剩下的位置隨便排

1 3 4 4 4 5 5

4 4 5 5 4 1 3

答案就是 4

可以自己再舉幾個例子試試

**:

#includeusing namespace std; 

typedef long long ll;

const int maxn = 1e5+5;

ll a[maxn];

mapmp;

int main()

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

}

cf水題記錄

記錄幾道水題 第一題題目鏈結 題目大意 給 n和m 問1 n裡面m的倍數中個位數的和是多少.某場div3的c題.n m肯定是1 n裡面m倍數的個數.那麼這些數裡面各位數的和怎麼算呢?分析一下可以知道最多10個數後就會進入迴圈.因為0 9只有10個數嘛.可以手動先把每個數的迴圈陣列算出來.當然這是最直...

cf669d 觀察規律

jibancanyang author jibancanyang created time 一 4 25 01 45 31 2016 file name cf669d.cpp problem 觀察規律 get 有規律奇數偶數總是相互間隔,且奇數同奇數相對位置不變,偶數同偶數相對位置不變。說以還是要多...

CF591CF01串的變換,找規律

這題知道應該是乙個規律題,然而並沒有什麼卵用,規律找不到,ac不了,前面倆題手速不夠快,只能掉rating。說一下這題的規律 首先只有101和010會變化,很明顯可以知道,然後開個陣列,記錄需要變化的位置,然後每一段需要變化的01串需要交換的次數為 len 1 2 然後變化的規律 具體細節看 另外貼...