51nod 1305 Pairwise Sum and Divide

版权声明:本文为博主原创文章,未经博主允许不得转载。 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 (每个配对一次 ) 加上就是答案

还是想法重要

猜你喜欢

转载自blog.csdn.net/qq_34271269/article/details/52610245