题解 P1376 【机器工厂】

Ryan_

2019-09-29 09:38:31

Solution

一道普及题,看来是自己想太多了 一开始的贪心策略是 第一周直接计算答案就好 若往后的一周保养费乘以第一周的所有订单比 往后的那一周还要小的话我们即考虑在第一周 就买好第二周需要的货,否则就不买 如果第一周囤货确实时价格更少了 那么我们就考虑第三周该不该囤货,以及实在第一周囤货 还是在第二周囤货以此类推 注意:被cut掉的方案永远不会再用,因为越往后性价比 只可能越劣,所以前面的方案肯定比后面(cut掉)的方案劣 于是最高70分,想了想大仙自己没有考虑到,随着i的增大,原本更优的方案,可能会比原本更劣的(已经cut掉的)方案更劣 **30分代码** ``` #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int long long n,s,ans=0; struct object{ int cost,sale; }a[10001]; int main(){ scanf("%d%d",&n,&s); for(int i=1;i<=n;i++){ scanf("%d%d",&a[i].cost,&a[i].sale); } ans+=a[1].cost*a[1].sale; int flag=1; for(int i=2;i<=n;i++){ if(a[flag].cost*(i-flag)*s*a[i].sale<a[i].cost*a[i].sale){ ans+=a[flag].cost*((i-flag)*s*a[i].sale); if(a[flag].cost*(i-flag+1)*s*a[i+1].sale>=a[i].cost*s*a[i+1].sale){ flag=i; } } else { flag=i; ans+=a[flag].cost*a[flag].sale; } } printf("%d",ans); return 0; } ``` **60分代码** ``` #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int long long n,s,ans=0; struct object{ int cost,sale; }a[10001]; int main(){ scanf("%d%d",&n,&s); for(int i=1;i<=n;i++){ scanf("%d%d",&a[i].cost,&a[i].sale); } ans+=a[1].cost*a[1].sale; int flag=1; for(int i=2;i<=n;i++){ if(a[flag].cost*a[i].sale+(i-flag)*s*a[flag].sale<a[i].cost*a[i].sale){ ans+=a[flag].cost*a[i].sale+((i-flag)*s*a[i].sale); if(a[flag].cost*a[i+1].sale+(i-flag+1)*s*a[i+1].sale>=a[i].cost*s*a[i+1].sale){ flag=i; } } else { flag=i; ans+=a[flag].cost*a[flag].sale; } } printf("%d",ans); return 0; } ``` **70分代码** ``` #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int long long n,s,ans=0; struct object{ int cost,sale; }a[100001]; int main(){ scanf("%lld%lld",&n,&s); for(int i=1;i<=n;i++){ scanf("%lld%lld",&a[i].cost,&a[i].sale); } ans+=a[1].cost*a[1].sale; int flag=1; for(int i=2;i<=n;i++){ if(a[flag].cost*a[i].sale+(i-flag)*s*a[flag].sale<a[i].cost*a[i].sale){ ans+=a[flag].cost*a[i].sale+((i-flag)*s*a[i].sale); if(a[flag].cost*a[i+1].sale+(i-flag+1)*s*a[i+1].sale>=a[i].cost*s*a[i+1].sale){ flag=i; } } else { flag=i; ans+=a[flag].cost*a[flag].sale; } } printf("%lld",ans); return 0; } ``` 100分代码 ``` #include<bits/stdc++.h> using namespace std; long long minn(int long long a,int long long b){ if(a<b)return a; else return b; } int main(){ int long long last,n,s,ans=0; cin>>n>>s; for(int i=1,a,b;i<=n;i++){ cin>>a>>b; if(i==1)last=a; else last=minn(last+s,a); ans+=last*b; } cout<<ans; return 0; } ```