D. Epic Transformation

D. Epic Transformation

题目 :https://codeforces.com/problemset/problem/1506/D

题目大意:让你输入一个长度为n的数组,将数组中的元素两两匹配将不相等的去掉

例如:

For example, if n=6 and a=[1,6,1,1,4,4], then you can perform the following sequence of operations:

  • select i=1,j=5 The array a becomes equal to [6,1,1,4][6,1,1,4];

  • select i=1,j=2 The array a becomes equal to [1,4][1,4].

    这时输出结果为 0;

这时我们要考虑如何消掉不相同的,到最后又会剩下那些数。

**当数中有我们无法消除的数时 ,这个数一定是重复出现次数最多的数(前提n为偶数)求出max1为最大数 然后用x=max1-(n-max1) **

所以我们需要求出重复数字出现的最多次数。

完整代码:

#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
const  int N=1000010;

int  n,m;
int  a[N];
int main()
{
   int t;
   cin>>t;
   while(t--)
   {
       cin>>n;
       for(int i=0;i<n;i++)    
           scanf("%d",&a[i]);    
       sort(a,a+n);//排序 然后求最大次数
       int max1=1;
       m=1;
        for( i=0;i<n-1;i++)
        {
            if(a[i]==a[i+1]) m++;
            if(a[i]!=a[i+1]) m=1;
            max1=max(max1,m);
        }
      if(n%2==1){//n为奇数时 输出的数肯定>=1
          
          int x=2*max1-n;
          if(x<=0 || max1==1){
              printf("1\n");
              continue;
          }
          printf("%d\n",x);
      }
      else{
           int x=2*max1-n;
          if(x<=0 || max1==1){
              printf("0\n");
              continue;
          }
          printf("%d\n",x);
      }
   }
 
    
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值