codeforce817B Makes And The Product (排序)

来源:互联网 发布:js 数组 按50为一批 编辑:程序博客网 时间:2024/04/30 08:07

题目链接:http://codeforces.com/problemset/problem/817/B

题目大意:让你找出三个最小的数,并且求解这三个数有几种组合的情况

解题思路:先新建数组存数字,然后再排序,再新建一个数组,用来存储每个数出现的次数(不知道算不算离散化),最后进行讨论处理。

代码:

#include <bits/stdc++.h>using namespace std;#define ll long longconst int maxn=1e5+20;ll b[maxn];ll a[maxn];int main(){    int x;scanf("%d",&x);    memset(a,0,sizeof(a));    for(int i=0;i<x;i++) scanf("%lld",&b[i]);    sort(b,b+x);    int flag=0;ll tmp=b[0];    int sum=1;    for(int i=1;i<x;i++){        if(tmp!=b[i]){            a[flag++]=sum;            tmp=b[i];            sum=1;        }        else sum++;    }    a[flag]=sum;    //cout<<a[0]<<endl;    int n=3;    ll ans[4];    memset(ans,0,sizeof(ans));    int i=0;    for(int j=1;j<=3;j++){        if(n!=0)        while(!a[i]) i++;        if(a[i]>=n){            if(n!=0) ans[j]=a[i];            else ans[j]=0;            n=0;        }        else{            ans[j]=a[i];            n-=a[i];        }        i++;    }    if(ans[2]==0){        printf("%lld\n",ans[1]*(ans[1]-1)*(ans[1]-2)/6);    }    else{        if(ans[3]==0){            if(ans[1]==1)                printf("%lld\n",1*(ans[2]*(ans[2]-1))/2);            else                printf("%lld\n",1*ans[2]);        }        else printf("%lld\n",ans[1]*ans[2]*ans[3]);    }}


阅读全文
1 0