小Q 是一个专业的射击运动员,有一天他像往常一样进行 n 次射击训练,每次射击他都会取最高的四次得分作为最终得分来衡量他的射击状态,但是今天他制定了一个奇怪的规则:在 n 次射击得分中取出四次得分 a,b,c,d ,并且满足 a*b*c=d 作为最终得分来衡量他的射击状态。
但是 小Q 发现满足这个条件的 (a,b,c,d) 可能不止一个,小Q 需要你来帮助他计算一共有多少个这种 (a,b,c,d)
数据范围: ,输入的所有得分满足
小Q 是一个专业的射击运动员,有一天他像往常一样进行 n 次射击训练,每次射击他都会取最高的四次得分作为最终得分来衡量他的射击状态,但是今天他制定了一个奇怪的规则:在 n 次射击得分中取出四次得分 a,b,c,d ,并且满足 a*b*c=d 作为最终得分来衡量他的射击状态。
输入包括两行,第一行包括一个正整数n,表示射击的次数。
第二行n个正整数,表示每次射击的得分。
输出可以作为最终得分的种数。
6 10 2 2 7 40 160
2
有两种满足条件的(a,b,c,d)分别是(10,2,2,40)和(2,2,40,160)。
#include<iostream> (720)#include<algorithm> using namespace std; const int N=505; const int WJ=1e6+5; int main() { int n; int arr[N]; int help[WJ]={0}; int i,j,k,m; cin>>n; for(i=0;i<n;i++) cin>>arr[i]; sort(arr,arr+n); for(i=0;i<n;i++) help[arr[i]]=1; int ans=0; for(i=0;i<n-2;i++) { for(j=i+1;j<n-1;j++) { for(k=j+1;k<n;k++) { if(arr[i]*arr[j]*arr[k]>arr[n-1]) break; if(help[arr[i]*arr[j]*arr[k]]==1) ans++; } } } cout<<ans; return 0; }/*下面是我自己的代码,时间复杂度可能有点高,毕竟嵌套了四层循环
#include<iostream> (720)#include<algorithm> using namespace std; const int N=505; int main() { int n; int arr[N]; int i,j,k,m; int a,b,c,d; cin>>n; for(i=0;i<n;i++) cin>>arr[i]; sort(arr,arr+n); int ans=0; for(i=0;i<n-3;i++) { a=arr[i]; for(j=i+1;j<n-2;j++) { b=arr[j]; for(k=j+1;k<n-1;k++) { c=arr[k]; for(m=k+1;m<n;m++) { d=arr[m]; if(a*b*c==d) ans++; if(a*b*c>d) break; } } } } cout<<ans; return 0; }*/
#include <bits/stdc++.h> using namespace std; int main() { int n,w[501],res=0,vim[1000005]; cin>>n; for(int i=0;i<n;i++) { cin>>w[i]; vim[w[i]]=1; } sort(w,w+n); for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { for(int k=j+1;k<n;k++) { int m=w[i]*w[j]*w[k]; if(m>w[n-1]) break; else if(vim[m]==1) res++; } } } cout<<res<<endl; return 0; }
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan=new Scanner(System.in); while(scan.hasNext()){ int n=Integer.valueOf(scan.nextLine()); int[]data=new int[n]; String s=scan.nextLine(); String[]strs=s.split(" "); for(int i=0;i<n;i++){ data[i]=Integer.valueOf(strs[i]); } System.out.println(get(n,data)); } } public static int get(int n,int[]data){ int count=0; long tem=0; Arrays.sort(data); int[]help=new int[1000005]; for(int i=0;i<n;i++){ help[data[i]]=1; } for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ for(int k=j+1;k<n;k++){ tem=data[i]*data[j]*data[k]; if(tem>1000005){ break; } else { int temh=(int)tem; if(help[temh]==1){ count++; } } } } } return count; } }
#include <bits/stdc++.h> using namespace std; int main(){ int n; scanf("%d", &n); int a[n], m=0, cnt=0; bool mp[100001] = {false}; for(int i=0;i<n;i++){ scanf("%d", &a[i]); mp[a[i]] = true; } sort(a, a+n); for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ for(int k=j+1;k<n;k++){ m = a[i]*a[j]*a[k]; if(m>a[n-1]) break; else if(mp[m]) cnt++; } } } printf("%d\n", cnt); return 0; }
import sys number = eval(input()) num_list = [] lst = input() for i in lst.split(): num_list.append(eval(i)) num_list.sort() def fullfill(a, b, c, d) : if (a==b): return fullfill(a, b+1, c, d) if (b==c): return fullfill(a, b, c+1, d) if (c==d): return fullfill(a, b, c, d+1) if d>=number: return 0 product = num_list[a]*num_list[b]*num_list[c] if product < num_list[d]: return fullfill(a, b, c, d+1) else: return (product == num_list[d]) + max(fullfill(a, b+1, c, d), fullfill(a, b, c+1, d), fullfill(a+1, b, c, d)) print(fullfill(0, 1, 2, 3))This code used a sorting function, which costs O(nlogn) time, simply moving the window should give O(n) amount of time. Therefore, the overall runtime should be O(nlogn)