zl程序教程

您现在的位置是:首页 >  其它

当前栏目

刷题记录:NC16301强迫症

记录 刷题
2023-09-14 09:12:54 时间

传送门:牛客
题目描述:

铁子最近犯上了强迫症,他总是想要把一个序列里的元素变得两两不同,而他每次可以执行一个这样的操作,他可以\
选择序列里的任意两个元素相加,不妨记作ai和aj,然后把ai+aj放进序列里,再删掉ai和aj其中的随便一个,问最少操
作多少次可以完成铁子的愿望?
输入:
3
1 2 2
输出:
1

首先这是一道思维题

主要思路:

  1. 其实刚开始我又又又被这种"简单"的思维题给卡住了(可能我并不适合解这种思维题??),凭借我强大的毅力,我强行迫使自己不打开题解,然后硬想了一会儿,没想到真被我想了出来…
  2. 就拿1 1 8 8 10这个栗子,我们思考一下如果相加肯定不会是累加之后的值跟原本序列中的值重复呢(即 即使我们操作之后依旧是重复的),当然是和当前序列中最大的值相加了,此时我们得到的肯定是和原序列没有任何重复的.也就是我们将重复的数字留下一个,将其他的都和当前最大的值相加即可,也就是说我们此时的答案就是每一个重复数字的个数减一的累加

所以我们并不一定做不出来这种假老虎的题目(bushi

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <stack>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
	ll x=0,w=1;char ch=getchar();
	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return x*w;
}
int maxn=1000000009;
int a[100006];
int main() {
	int n;n=read();
	for(int i=1;i<=n;i++) {
		a[i]=read();
	}
	int sum=0;
	sort(a+1,a+n+1);
	for(int i=2;i<=n;i++) {
		if(a[i]==a[i-1]) {
			sum++;
		}
	}
	cout<<sum<<endl;
}