MT41. 射击训练
描述
小Q 是一个专业的射击运动员,有一天他像往常一样进行 n 次射击训练,每次射击他都会取最高的四次得分作为最终得分来衡量他的射击状态,但是今天他制定了一个奇怪的规则:在 n 次射击得分中取出四次得分 a,b,c,d ,并且满足 a*b*c=d 作为最终得分来衡量他的射击状态。
输入描述
输入包括两行,第一行包括一个正整数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; }