牛客小白月赛4 20180616J

题目描述

铁子最近犯上了强迫症,他总是想要把一个序列里的元素变得两两不同,而他每次可以执行一个这样的操作,他可以选择序列里的任意两个元素相加,不妨记作ai和aj,然后把ai+aj放进序列里,再删掉ai和aj其中的随便一个,问最少操作多少次可以完成铁子的愿望?
输入描述:
第一行一个整数n表示序列的长度(1≤n≤1e5),第二行n个整数ai表示序列的每个整数(1≤ai≤109)
输出描述:
输出一行表示答案
示例1
输入
3
1 2 2
输出
1

分析

似乎是一道贪心题,将其抽象化,一开始有n个数字,结束时有m个数字,贪心得想要最少合并n-m次,所以这就是答案,时间:26ms。
上代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int al[100001];
long long ans=0,n;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&al[i]);
    sort(al+1,al+1+n);
    for(int i=1;i<=n;i++){
        if(al[i]!=al[i-1]) ans++;
    }
    printf("%d\n",n-ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sjzezwzy/article/details/80715406