5 条题解

  • 1
    @ 2026-4-28 20:20:48

    数据较小(n12n\le 12),所以本蒟蒻用搜索写的,勿喷

    #include<bits/stdc++.h>
    using namespace std;
    int n,x,y,z,ans=1e9,a[110],dist[20][1005];
    void dfs(int t,int u,int s)
    {
    	if(s>=ans)return;
    	if(t==n+1)
    	{
    		ans=s;
    		return;
    	}
    	if(u<=a[t])//比至少要的员工少
    	{
    		if(dist[t][a[t]]>s+(a[t]-u)*x+a[t]*y)//剪枝
    		{
    			dist[t][a[t]]=s+(a[t]-u)*x+a[t]*y;
    			dfs(t+1,a[t],s+(a[t]-u)*x+a[t]*y);
    		}
    	}
    	else
    	{
    		for(int i=0;i<=u-a[t];i++)//可以裁0~当前员工-至少员工个
    			if(dist[t][u-i]>s+i*z+(u-i)*y)//剪枝
    			{
    				dist[t][u-i]=s+i*z+(u-i)*y;
    				dfs(t+1,u-i,s+i*z+(u-i)*y);
    			}
    	}
    }
    int main()
    {
    	memset(dist,0x3f,sizeof dist);
    	cin>>n>>x>>y>>z;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	dfs(1,0,0);//当前月数 员工人数 花钱费用
    	cout<<ans;
    	return 0;
    }
    

    不点赞是gay \fcolorbox{gray}{gray}{\color{gray}{gay}}!!!

    • 0
      @ 2026-4-30 20:31:43
      #include <bits/stdc++.h>
      using namespace std;
      int n, hire, paid, cut, w[20], had, cost;
      int main() {
      	cin >> n >> hire >> paid >> cut;
      	for (int i = 1; i <= n; ++ i) cin >> w[i];
      	had = w[1], cost = (hire + paid) * w[1];
      	for (int i = 2; i <= n; ++ i) {
      		cost += paid * w[i];
      		if (w[i] >= had) {
      			cost += hire * (w[i] - had);
      			had = w[i];
      			continue;
      		}
      		int gap = had - w[i];
      		for (int j = 1; j <= gap; ++ j) {
      			int sub = n + 1, cost1 = 0, cost2 = 0;
      			for (int k = i + 1; k <= n; ++ k)
      				if (w[k] >= w[i] + j) {
      					sub = k;
      					cost1 = hire;
      					break;
      				}
      			cost1 += cut, cost2 = paid * (sub - i);
      			if (cost1 >= cost2) cost += paid;
      				else cost += cut, -- had;
      		}
      	}
      	cout << cost;
      	return 0;
      }
      
      • 0
        @ 2026-4-28 20:48:18
        #include <bits/stdc++.h>
        using namespace std;
        int n,a,b,c,ned[200],ans,m,c1,c2,k;
        int main()
        {
        	cin>>n;
        	cin>>a>>b>>c;
        	for(int i=1;i<=n;i++) cin>>ned[i];
        	ans=(a+b)*ned[1];
        	for(int i=2;i<=n;i++)
        	{
        		ans=ans+b*ned[i],m=ned[i]-ned[i-1];
        		if(m>=0) ans=ans+a*m;
        		else
        		{
        			m=abs(m);
        			for(int j=1;j<=m;j++)
        			{
        				c1=0;
        				for(k=i+1;k<=n;k++)
        					if(ned[k]>ned[i])
        					{
        						c1=a;
        						break;
        					}
        				c1+=c;
        				c2=b*(k-i);
        				if(c1>=c2) ned[i]++,ans+=b;
        					else 
        					{
        						ans+=c*(m-j+1);
        						break;
        					}
        			}
        		}
        	}
        	cout<<ans;
        }
        
        • -2
          @ 2026-4-28 20:52:11

          刀片解,不喜勿喷

          dpijdp_{ij}:第ii个月雇佣jj个人的最小花费。 dpijdp_{ij}通过查找前一个月雇佣人的最小金额来求最小值得出。

          #include<bits/stdc++.h>
          using namespace std;
          int dp[15][1005],n,x,y,z,a[10005],mi=INT_MAX;
          int main(){
          cin>>n>>x>>y>>z;
          cin>>a[1];
          for(int i=a[1];i<=1000;i++)dp[1][i]=i*(x+y);//初始化
          for(int i=2;i<=n;i++){
          cin>>a[i];//输入
          for(int j=a[i];j<=1000;j++){
          dp[i][j]=INT_MAX;//初始化
          for(int k=a[i-1];k<=1000;k++){
          int s;
          if(k>j)s=(k-j)*z+dp[i-1][k]+y*j;//若人多了,就解雇几个
          else s=(j-k)*x+dp[i-1][k]+y*j;//若人少了,就雇佣几个
          dp[i][j]=min(s,dp[i][j]);//求最小值
          }
          if(i==n)mi=min(mi,dp[i][j]);//求答案
          }
          }cout<<mi;//输出
          return O;
          }
          
          • -2
            @ 2026-4-28 20:47:12

            刀片解,不喜勿喷

            #include<bits/stdc++.h>
            using namespace std;
            int dp[15][1005],n,x,y,z,a[10005],mi=INT_MAX;
            int main(){
            cin>>n>>x>>y>>z;
            cin>>a[1];
            for(int i=a[1];i<=1000;i++)dp[1][i]=i*(x+y);//初始化
            for(int i=2;i<=n;i++){
            cin>>a[i];//输入
            for(int j=a[i];j<=1000;j++){
            dp[i][j]=INT_MAX;//初始化
            for(int k=a[i-1];k<=1000;k++){
            int s;
            if(k>j)s=(k-j)*z+dp[i-1][k]+y*j;
            else s=(j-k)*x+dp[i-1][k]+y*j;
            dp[i][j]=min(s,dp[i][j]);//求最小值
            }
            if(i==n)mi=min(mi,dp[i][j]);//求答案
            }
            }cout<<mi;//输出
            return O;
            }
            
            • @ 2026-4-28 20:47:59

              注释台水了

            • @ 2026-4-30 19:55:24

              代码格式好奇怪,真差劲

          • 1

          信息

          ID
          866
          时间
          1000ms
          内存
          256MiB
          难度
          6
          标签
          递交数
          89
          已通过
          28
          上传者