算法:uva 1169

题目大意

(LRJ《训练指南》)

有n个垃圾,第i个垃圾的坐标为(xi,yi),重量为wi。有一个 机器人,要按照编号从小到大的顺序捡起所有垃圾并扔进垃圾桶(垃圾桶在原点(0,0))。机器人可以捡起几 个垃圾以后一起扔掉,但任何时候其手中的垃圾总重量不能超过最大载重C。两点间的行走距离为曼哈顿距离 (即横坐标之差的绝对值加上纵坐标之差的绝对值)。求出机器人行走的最短总路程(一开始,机器人在 (0,0)处)。

【输入格式】

输入的第一行为数据组数。每组数据的第一行为最大承重C(1≤C ≤100);第二行为正整数n(1≤n≤100 000),即垃圾的数量;以下n行每行为两个非负整数x, y和一个正 整数w,即坐标和重量(重量保证不超过C)。

【输出格式】

对于每组数据,输出总路径的最 短长度。

思路

方法一:

sumDis[i], 表示从0->1->2->....->i,即从0一 直走到i个总距离

sumWeight[i], 表示前i个垃圾的总重量

假设要捡(j, i)这区间内的垃圾,

令 w(j,i) = sumWeight[i] - sumWeight[j-1]; 表示(j,i)区间垃圾的总重量

机器人的走路路径为:0- >j->j+1->..->i->0,这段路的总距离为:

routeDist(j, i) = getDis(0, j) + sumDis[i] - sumDis[j] + getDis(0, i)

设f(i)表示捡完前i个垃圾走的最短距离,那么可得到状态转移

f(i) = min{ f(j-1) + routeDist(j, i),  1<=j<=i && sumWeight[i]-sumWeight[j-1] >= C }

代码一

/**==========================================
* This is a solution for ACM/ICPC problem
*
* @source:uva-1169 Robotruck
* @type: dp
* @author: shuangde
* @blog: blog.csdn.net/shuangde800
* @email: zengshuangde@gmail.com
*===========================================*/

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;

typedef long long int64;
const int INF = 0x3f3f3f3f;

const int MAXN = 100010;
int C, n;
int sumDis[MAXN], sumWeight[MAXN];
int f[MAXN];

struct Node{
int x, y, w;
}A[MAXN];

int getDis(int i, int j) {
return abs(A[i].x-A[j].x) + abs(A[i].y-A[j].y);
}

int main(){

int nCase;
scanf("%d", &nCase);

while(nCase--) {
scanf("%d%d", &C, &n);
for(int i = 1; i <= n; ++i) {
scanf("%d%d%d", &A[i].x, &A[i].y, &A[i].w);
sumDis[i] = sumDis[i-1] + getDis(i, i-1);
sumWeight[i] = sumWeight[i-1] + A[i].w;
}

for(int i = 1; i <= n; ++i) {
f[i] = INF;
for(int j = i; j >= 1; --j) {
int w = sumWeight[i] - sumWeight[j-1];
if(w > C) break;
int dis = getDis(0, j) + sumDis[i] - sumDis[j] + getDis(0, i);
f[i] = min(f[i], f[j-1]+dis);
}
}

printf("%d\n", f[n]);
if(nCase) putchar('\n');
}

return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据
, 路径最短
, 机器人
, 算法训练
, 整数
, 区间
, 绝对值
, 坐标距离
垃圾
海尔1169、169、601169、1169万韩元、1069,以便于您获取更多的相关知识。

时间: 2024-12-24 22:04:42

算法:uva 1169的相关文章

算法题之UVA 763

Fibinary Numbers The standard interpretation of the binary number 1010 is 8 + 2 = 10. An alternate way to view the sequence ``1010'' is to use Fibonacci numbers as bases instead of powers of two. For this problem, the terms of the Fibonacci sequence

算法题:UVa 591 Box of Bricks (模拟)

591 - Box of Bricks Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&category=467&page=show_problem&problem=53 2 Little Bob likes playing with his box of bricks. He puts the bricks one upon an

算法题之UVA 10891

This is a two player game. Initially there are n integer numbers in an array and players A and B get chance to take them alternatively. Each player can take one or more numbers from the left or right end of the array but cannot take from both ends at

算法题:uva 10318

题目链接: 首先,可以确定每个格子只能选一次,因为选任何大于0的偶数次,等于没有效果 一样. 然后,就可以把这题理解成从r*c的矩阵中选择一些格子进行"点亮"操作,使得最终所 有格子都是"亮"的状态.那么,每个格子要么有点亮操作,要么没有,总共复杂度为2^25,显然必须 进行减枝. 假设从第一行第一列开始,从左往右,从上往下一次依次选择,对于当前所在位置( x, y),它已经不能影响到x-2以前的行数了,所以当到x行时,如果第x-2行没有全部点亮,则进行减枝 . 此

算法题:uva 1330

题目链接: http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&category=460&page=show_problem&problem=4076 以前做过一道一维的,这题只是变成了二维的,其他方法都一样.HDU 1506  Largest Rectangle in a Histogram   题解 代码1: #include<cstdio> #include<cs

算法:UVa 11572

题目大意: 给n个数, n<=100W,求一个连续子序列,这个子序列中没有重复的数,问这个子序列最长是多少? 思路: 开一个数组pos,  pos[ x ] 表示x出现的位置, 这个数组初始化为-1 用一个变量start来记录当前枚举序列的起点,初始为0 然后枚举这个序列,依次记录每个数的位置, 假设当前枚举到i, 在记录这个位置之前,先检查当前这个数的位置pos[ arr[i] ]是否大于等于start,如果大于,说明这个数已经在[start, i-1]中已经出现过了,记下这个满足条件的子序列

算法:UVa 11536

题目大意: 给一个序列 X1 = 1 X2 = 2 X3 = 3 Xi = (Xi-1 + Xi-2 + Xi-3) % M + 1         for i = 4 to N 求一段最短的连续子序 列,使得这个子序列包含正整数[1,k] 思路: 扫描一遍即可,用一个队列记录下[1, k]区间内的数的位置,再用一个变量count维护[1,k]内不重复数的个数.当count等于k时说明当前 序列已经满足了要求,而队列头的数的位置就是起始位置. 算法复杂度O(n) 代码: /* * UVa 115

算法:UVa 12174

[题目大意] 你在听音乐播放器,它采用随机播放形式.随机播放的原理时先随机产生一个 1~n的排列,然后就按这个排列顺序播放歌曲.播放完这序列的所有歌曲以后,再次随机生成一个1-n的 排列,再继续播放. 现在给你一个播放历史记录,这个历史记录是不完整的,以为它是开始记录 时,已经有些歌曲播放过了而没有记录到. 现在给你一段从某个时刻开始的播放音乐的历史记录 ,以及播放器里一共有多少首歌. 问历史记录中第一首歌可能是某个随机列表中的第几首,总共 有多少种可能? [思路] 先进行预处理,用一个bool

UVa 10182 Bee Maja:规律&amp;amp;O(1)算法

10182 - Bee Maja Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=1123 Maja is a bee. She lives in a bee hive with thousands of other bees. This bee hive c