1. 程式人生 > >牛客小白月賽4 J 強迫癥 思維

牛客小白月賽4 J 強迫癥 思維

整數 double 情況 pre .com get font map 說明

鏈接:https://www.nowcoder.com/acm/contest/134/J
來源:牛客網

題目描述

鐵子最近犯上了強迫癥,他總是想要把一個序列裏的元素變得兩兩不同,而他每次可以執行一個這樣的操作,他可以選擇序列裏的任意兩個元素相加,不妨記作ai和aj,然後把ai+aj放進序列裏,再刪掉ai和aj其中的隨便一個,問最少操作多少次可以完成鐵子的願望?

輸入描述:

第一行一個整數n表示序列的長度(1≤n≤10
5
)
第二行n個整數a
i
表示序列的每個整數(1≤a
i
≤10
9
)

輸出描述:

輸出一行表示答案
示例1

輸入

復制
3
1 2 2

輸出

復制
1

說明

將序列的第1個整數和序列的第2個整數相加,再刪掉第2個整數。

分析:因為每次操作是在有相同數的情況下合並兩個數,直到最後沒有相同的數,所以我們每次合並的肯定是相同的數,所以直接加上每個數重復的個數-1就好了
AC代碼:
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define ls (r<<1)
#define rs (r<<1|1)
#define debug(a) cout << #a << " " << a << endl
using namespace std;
typedef long long ll;
const ll maxn = 1e6+10;
const double eps = 1e-8;
const ll mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const double pi = acos(-1.0);
int main() {
    ios::sync_with_stdio(0);
    ll n, ans = 0;
    cin >> n;
    map<ll,ll> mp;
    for( ll i = 0, x; i < n; i ++ ) {
        cin >> x;
        mp[x] ++;
    }
    for( auto i : mp ) {
        ans += i.second - 1;
    }
    cout << ans << endl;
    return 0;
}

  

牛客小白月賽4 J 強迫癥 思維