版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34271269/article/details/52610245
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
long long arr[200000];
int main()
{
int n ;
cin>>n;
int save=0;
long long ans=0;
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
if(x==2) save++;
else if(x==1) ans+=n-1;
}
ans=ans+(save)*(save-1)/2;
cout<<ans;
return 0;
}
这个题刚开始智障了 没看复杂度直接模拟肯定gg 但是感觉这个题每个答案只能在0 1 2 这几个上波动 于是仔细分析一下 :
发现了 这个其实就是不同的两个配对 只配一次 如果输入的这个值是1 那么他跟别的配对 要么答案是1 要么是 2 我们转念一想 如果有另外一个1 再配对 发现这样就会配对回来 每次加上n-1这个值就变化了 那么我们就很容易计算出每次遇到1 只要加一个n-1 就好了 2的个数要数一数 最后为save*(save-1)/2 (每个配对一次 ) 加上就是答案
还是想法重要