原題連線:
題意:給出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 然後變化的規律 具體細節看 另外貼...