5 条题解
-
1
数据较小(),所以本蒟蒻用搜索写的,勿喷
#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; }不点赞是!!!
-
0
#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
#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
刀片解,不喜勿喷
:第个月雇佣个人的最小花费。 通过查找前一个月雇佣人的最小金额来求最小值得出。
#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
刀片解,不喜勿喷
#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; }
- 1
信息
- ID
- 866
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 89
- 已通过
- 28
- 上传者