您的位置:首页 > 其它

POJ 2393 Yogurt factory(贪心)

2017-07-29 11:14 393 查看
题意,给出n和s,你有n个星期,每个星期生产的花费是不同的,为c_i,然后每个星期指标是不同的,要生产y_i件商品。当然,你可以上几个星期生产了一直保存这到这个星期来交货,但是每个星期的保存花费是s。问要完成这些指标的最小花费是多少。

解法:反正我就瞎搞了一发,遍历一次,如果相邻的两个星期花费之差(后-前)大于s,那么肯定可以用前一个星期+s代替当前这个星期,然后更新这个星期即可。前面的有没有可能呢?是不可能的,你每一步都贪心去更新,保证前面的都是最优的。那么c[i-1]  - c[i-2]  <= s,这样才不会更新,此时c[i] - c[i-1] > s,如果你硬是要从i-2这个过来,此时花费为c[i-2] + 2 * s,和c[i-1]+s相比,不就是前面第一个不等式两边同时加上s吗,则有c[i-1] + s <= c[i-2]
+ 2 * s吗,所以直接从前一天更新到这里肯定是最优的。

其实我当时不是这样想的- -!我以为前面可能也可以,然后就写了一发,发现1A,才来想这个结论。。。代码懒得改了。。。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e4 + 5;
int c[maxn], y[maxn], dv[maxn];

int main () {
int n, s;
int cnt, tmp, j;
cin >> n >> s;
for(int i = 0; i < n; i++)
scanf("%d%d", &c[i], &y[i]);
for(int i = 1; i < n; i++) {
dv[i] = c[i] - c[i - 1];
if(dv[i] > s) {
cnt = 2;
tmp = dv[i];
for(j = i - 1; j >= 1; j--) {
tmp += dv[j];
if(tmp < cnt * s)
break;
cnt++;
}
c[i] = c[j] + s * (cnt - 1);
}
}
long long ans = 0;
for(int i = 0; i < n; i++) {
ans += c[i] * y[i];
}
cout << ans << endl;
return 0;
}算了还是改一改吧- -
代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e4 + 5;
int c[maxn], y[maxn];

int main () {
int n, s;
int cnt, tmp, j;
cin >> n >> s;
for(int i = 0; i < n; i++)
scanf("%d%d", &c[i], &y[i]);
for(int i = 1; i < n; i++) {
if(c[i] - c[i - 1] > s) {
c[i] = c[i - 1] + s;
}
}
long long ans = 0;
for(int i = 0; i < n; i++) {
ans += c[i] * y[i];
}
cout << ans << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: