列表

详情


MT41. 射击训练

描述

小Q 是一个专业的射击运动员,有一天他像往常一样进行 n 次射击训练,每次射击他都会取最高的四次得分作为最终得分来衡量他的射击状态,但是今天他制定了一个奇怪的规则:在 n 次射击得分中取出四次得分 a,b,c,d ,并且满足 a*b*c=d 作为最终得分来衡量他的射击状态。

但是 小Q 发现满足这个条件的 (a,b,c,d) 可能不止一个,小Q 需要你来帮助他计算一共有多少个这种 (a,b,c,d)

数据范围: ,输入的所有得分满足  

输入描述

输入包括两行,第一行包括一个正整数n,表示射击的次数。

第二行n个正整数,表示每次射击的得分。

输出描述

输出可以作为最终得分的种数。

示例1

输入:

6
10 2 2 7 40 160

输出:

2

说明:

有两种满足条件的(a,b,c,d)分别是(10,2,2,40)和(2,2,40,160)。

原站题解

C++ 解法, 执行用时: 3ms, 内存消耗: 376KB, 提交时间: 2020-08-28

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n;
    cin>>n;
    int a[500],vis[1000005];
    for(int i=0;i<n;i++){
        cin>>a[i];
        vis[a[i]]=1;
    }
    sort(a,a+n);
    int ans=0;
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            for(int k=j+1;k<n;k++){
                int tmp=a[i]*a[j]*a[k];
                if(tmp>a[n-1])
                    break;
                else if(vis[tmp]==1)
                    ans++;
            }
        }
    }
    cout << ans <<endl;
    return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 456KB, 提交时间: 2020-07-23

#include <bits/stdc++.h>
#define maxm 1000005
using namespace std;
int main(){
    int n;
    while(cin>>n){
        int *vim=new int[maxm];
        int count=0;
        vector<int> arr(n);
        for(int i=0;i<n;i++){
            cin>>arr[i];
            vim[arr[i]]=1;
        }
        sort(arr.begin(),arr.end());
        for(int i=0;i<n;i++)
            for(int j=i+1;j<n;j++)
                for(int k=j+1;k<n;k++)
                {
                    int tmp=arr[i]*arr[j]*arr[k];
                    if(tmp>arr[n-1])
                        break;
                    else if(vim[tmp]==1)
                        count++;
                }
        cout<<count<<endl;
    }
    return 0;
}

上一题