【CodeForces】【思维题】817 B Makes And The Product

【题目】http://codeforces.com/problemset/problem/817/B

【题意】给出一串数字,从这串数字中取3个数使乘积最小,问有多少种取法

【思路】记录每个数出现的次数,找到最小的3个数,

                                            1:如果3个数一样,那么答案是C(cnt(x),3);

                                            2:如果x1和x2一样,与x3不同,那么答案就是 cnt(x3);(x1和x2的cnt当然是2啊,C(2,2)=1啊)

                                            3:x1!=x2时当然x1!=x3;

                                            4:x2==x3时,答案是C(cnt(x2),2);

                                            5:x1!=x2!=x3时,答案是cnt(x3);

【代码】

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const ll M=1e9+10;
const ll N=1e9+10;
map<ll,ll>cnt;

ll combination(ll n,ll m)
{
	ll i,j;
	ll sum=1;
	if(n==0||m==0)
	  return 1;
	else
	{
	for( i=m+1,j=1;i<=n;i++,j++)
	{
		sum=sum*i/j;
	}
		 return sum;
	}
}


int main()
{
    ll n;
    cin>>n;
    ll m1=N,m2=N,m3=N;
    for(ll i=0; i<n; i++)
    {
        ll t;
        scanf("%lld",&t);
        if(t<m1)
        {
            m3=m2;
            m2=m1;
            m1=t;
        }
        else if(t<m2)
        {
            m3=m2;
            m2=t;
        }
        else if(t<m3)
        {
            m3=t;
        }
        cnt[t]++;
    }
    //cout<<cnt[m1]<<cnt[m2]<<cnt[m3]<<endl;
    if(m1==m2&&m1==m3)
        cout<<combination(cnt[m1],3)<<endl;
    else if((m1==m2&&m1!=m3))
        cout<<cnt[m3]<<endl;
    else if((m2==m3&&m1!=m2))
        cout<<combination(cnt[m2],2)<<endl;
    else
        cout<<cnt[m3]<<endl;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值