1 条题解

  • 0
    @ 2024-12-20 22:24:57

    要凑出所有格子,肯定要凑出1。如果凑出1,所有格子都能凑出······

    如果某几个lil_i的gcd是1,那么这些跳跃卡能凑出1。

    即找一个跳跃卡集合,他们的gcd是1,并且ci\sum c_i 最小。 n只有300,可以随便乱搞..

    dp[gcd]dp[gcd]表示凑出这个gcd所用的最小花费。(状态转移见代码)

    void solve(){
    	map<int,int> dp;
    	int n;
    	cin>>n;
    	vector<int> l(n+1);
    	vector<int> c(n+1);
    	for(int i=1;i<=n;i++) cin>>l[i];
    	for(int i=1;i<=n;i++) cin>>c[i];
    
    	for(int i=1;i<=n;i++){
    		for(auto [g,val]:dp){
    			int ng = __gcd(g,l[i]);
    			if(dp.find(ng)==dp.end()){
    				dp[ng] = c[i] + val;
    			}else{
    				dp[ng] = min(dp[ng],c[i]+val);
    			}
    		}
    
    		if(dp.find(l[i])== dp.end()){
    			dp[l[i]] = c[i];
    		}else{
    			dp[l[i]] = min(dp[l[i]],c[i]);
    		}
    	}
    	if(dp.find(1)==dp.end()) cout<<-1<<endl;
    	else cout<<dp[1]<<endl;
    }
    

    信息

    ID
    222
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    3
    上传者