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;
}
解法:反正我就瞎搞了一发,遍历一次,如果相邻的两个星期花费之差(后-前)大于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;
}
相关文章推荐
- POJ 2393-Yogurt factory [贪心] 《挑战程序设计竞赛》2.2
- poj 2393 Yogurt factory(贪心)
- POJ 2393 Yogurt factory(贪心)
- poj 2393 && bzoj 1680: [Usaco2005 Mar]Yogurt factory(贪心)
- poj 2393 Yogurt factory(dp+贪心)
- poj 2393 Yogurt factory(贪心)
- POJ 2393 Yogurt factory~贪心详解
- POJ 2393 - Yogurt factory(贪心)
- poj 2393 Yogurt factory(贪心)
- POJ2393————Yogurt factory (贪心)
- POJ 2393 Yogurt factory(贪心)
- poj 2393 Yogurt factory(贪心)
- POJ 2393 Yogurt factory(贪心)
- POJ-2393(贪心) Yogurt factory
- POJ 2393 Yogurt factory 贪心
- poj 2393 Yogurt factory(贪心)
- 初识贪心:POJ2393--Yogurt factory
- Yogurt factory(POJ 2393 贪心 or DP)
- poj 2393 Yogurt factory(贪心)
- POJ 2393 Yogurt Factory(贪心 ?? dp)