Codeforces 6D

    xiaoxiao2025-02-25  21

    直接暴力dfs,保证前面的都能到0以下,当到n-1个的时候,还要保证后一个也要到0一下即可。 通常找最小值,dfs需要把所有情况跑遍,得出最小值。 发现如果最小值很小时,也可以通过从1开始枚举到有合理方案位置,即为最小值。 以下代码用的第一种方法

    #include <cmath> #include <algorithm> #include <cstdio> #include <cstdlib> using namespace std; int nu[12],n,a,b,ans=0x3f3f3f3f,out[12],out1[12]; void dfs(int x,int c) { if(c>=ans) return; if(x==n) { ans=c; for(int i=1;i<=n;i++)out1[i]=out[i]; } for(int i=0;;i++) { if(nu[x-1]-i*b>=0) continue; if(i+c>=ans) break; if(x==n-1&&nu[x+1]-b*i>=0) continue; out[x]=i; nu[x-1]-=b*i;nu[x]-=a*i;nu[x+1]-=b*i; dfs(x+1,c+i); nu[x-1]+=b*i;nu[x]+=a*i;nu[x+1]+=b*i; if(nu[x]-a*i<0&&nu[x+1]-b*i<0) break; } } int main() { scanf("%d%d%d",&n,&a,&b); for(int i=1;i<=n;i++) scanf("%d",&nu[i]); dfs(2,0); printf("%d\n",ans); for(int i=2;i<n;i++) for(int j=0;j<out1[i];j++) printf("%d ",i); }
    转载请注明原文地址: https://ju.6miu.com/read-1296638.html
    最新回复(0)