您的位置:首页 > 其它

Patches

2016-07-08 18:05 218 查看

Patches





题意:轮子上有n个洞,有两种规格的补丁条(无限条),问怎么补使得所用的长度最短

解法:dp

#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <cstring>

int n, m, t1, t2;
int f[3000], a[3000];

int min(int x, int y) {
if (x < y) return x;
return y;
}

int main() {
while ((scanf("%d %d %d %d", &n, &m, &t1, &t2)) != EOF) {
for (int i = 1; i <= n; i++) {
cin >> a[i];
int x = i;
while (x > 1 && a[x] < a[x-1]) {
int temp = a[x];
a[x] = a[x-1];
a[x-1] = temp;
x--;
}
a[n+i] = a[i]+m;
}
memset(f, 0, sizeof(f));
int ans = 1e9;
for (int k = 1; k <= n; k++) {
f[k-1] = 0;
f[k] = min(t1, t2);
for (int i = k+1; i <= k+n-1; i++) {
f[i] = f[i-1]+min(t1, t2);
for (int j = i-1; j >= k; j--) {
if (a[i]-a[j] <= t1)
f[i] = min(f[i], f[j-1]+t1);
if (a[i]-a[j] <= t2)
f[i] = min(f[i], f[j-1]+t2);
if (a[i]-a[j] > t1 && a[i]-a[j] > t2) break;
}
}
if (f[k+n-1] < ans) ans
4000
= f[k+n-1];
}
cout << ans << endl;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: