• Equation


    (Equation)

    这道题目把式子两面移一下项,变为

    [a_1*x_1+a_3*x_3+a_5*x_5=a_2*x_2+a_4*x_4+a_6*x_6 ]

    然后用类似于(meet in the middle)的方法进行对式子两边统计

    为什么当时没有做出来??

    • 时间复杂度分析错了
    • 主要原因还是搜索的答案数弄错了,正解的搜索方案数应该是 (k^3) ,如果考虑重复答案会更少,和 (a_i) 并没有关系,所以要仔细分析程序的时间复杂度
    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<map>
    #define ll long long
    using namespace std;
    const int N=10,MAXN=1e6+100;
    map<ll,int>m;
    ll k,ans;
    int base;
    ll a[N],b[N];
    int num[MAXN];
    inline void dfs2(int x,ll sum)
    {
    	if (!x)
    	{
    		if (m.find(sum)!=m.end())
    		ans+=num[m[sum]];
    		return ;
    	}
    	for (int i=1;i<=k;i++)
    	dfs2(x-1,sum+b[x]*i);
    	return ;
    }
    inline void dfs1(int x,ll sum)
    {
    	if (!x)
    	{
    		if (m.find(sum)!=m.end()) num[m[sum]]++;
    		else
    		{
    			m[sum]=++base;
    			num[base]=1;
    		}
    		return ;
    	}
    	for (int i=1;i<=k;i++)
    	dfs1(x-1,sum+a[x]*i);
    	return ;
    }
    int main()
    {
    	scanf("%lld",&k);
    	int num1=0,num2=0;
    	for (int i=1;i<=6;i++)
    	if (i%2==1) scanf("%lld",&a[++num1]);
    	else scanf("%lld",&b[++num2]);
    	dfs1(3,0);
    	dfs2(3,0);
    	printf("%lld
    ",ans);
    	return 0;
    }
    

    题外话:不要搞骚操作,多写几个变量,多写几句话死不了。

  • 相关阅读:
    LeetCode Notes_#20 Valid Parentheses
    LeetCode Notes_#14 Longest Common Prefix
    牛客21天刷题_day#3
    牛客21天刷题_day#2
    牛客21天刷题_day#1
    WebGL编程指南
    《Redis 设计与实现》
    《女士品茶》
    《Java应用架构设计:模块化模式与OSGi》
    《编译与反编译技术实战》
  • 原文地址:https://www.cnblogs.com/last-diary/p/11406078.html
Copyright © 2020-2023  润新知