Aizu 1306

Problem

玩一个捡金币游戏,现有N个金币从高空落下,玩家控制一辆小车左右开动捡金币(在x轴上开动,起初玩家在x=0处)。给出每个金币落地的时刻T[i] 和 落地的位置P[i],保证不会有两个金币同时落地。但小车只能装不超过3个金币,且小车速度随装载金币数量而变,速度=金币数量+1。玩家可以控制小车返回原点,返回原点时金币瞬间清空,玩家需要把所有的金币都运输到原点。问,玩家是否可以把所有金币都运回原点?如果可以,最小总距离是多少?如果不可以,第一个导致不可以的金币是哪一个?

Limits

Time Limit(ms): 8000

Memory Limit(MB): 65

N: 40

T[i]: [1, 50000],int

P[i]: [1, 100],int

Solution

很有意思的一道题,用dp来做。设dp[i][j]表示第 i 个金币捡到后小车有 j 个金币,dp[i][1]由dp[i-1][1],dp[i-1][2],dp[i-1][3]转移而来,dp[i][2]由dp[i-1][1]转移而来,dp[i][3]由dp[i-1][2]转移而来。若dp[n][j](j=1,2,3)存在,则可以把所有金币运回原点。

More

关键在于,玩家无法在小于T[i]时刻捡到第 i 个金币,捡到金币马上就走是最明智的,因此,若第 i 个金币能捡到,现只需判断当前到第 i+1 个金币的时间是否超过T[i+1]-T[i]即可。换句话说,在dp方程里不需要考虑时间因素。

if(当前可以从第i个金币到达第i+1个金币) dp[i][1]=min(dp[i][1],dp[i-1][j]+dis)(j=1,2,3)

if(当前可以从第i个金币到达第i+1个金币) dp[i][2]=min(dp[i][2],dp[i-1][1]+dis)

if(当前可以从第i个金币到达第i+1个金币) dp[i][3]=min(dp[i][3],dp[i-1][2]+dis)

最后,若dp[n][j](j=1,2,3)存在,则可以把所有金币运回原点,取dp[n][j](j=1,2,3)的最小值即可;否则不可把所有金币运回原点,找到第一个导致不可的金币即可。

Complexity

Time Complexity: O(N)

Memory Complexity: O(N*3)

Source

Aizu 1306

Code

Aizu 1306 From My Github

时间: 2024-10-11 04:27:05

Aizu 1306的相关文章

UVA 1306 - The K-League(网络流)

UVA 1306 - The K-League 题目链接 题意:n个球队,已经有一些胜负场,现在还有一些场次,你去分配胜负,问每支球队有没有可能获胜 思路:网络流公平分配模型,把场次当作任务,分配给人,然后先贪心,枚举每个人,让这些人能赢的都赢,剩下的去建图,每个源点连向比赛容量为场次,每个比赛连向2个球队,容量无限大,每个球队连向汇点,容量为每个的人的总和减去当前已经赢的,建完图跑一下最大流,然后判断源点流出的是否都满流即可 代码: #include <cstdio> #include &l

[codevs 1306]广播操的游戏(Trie)

题目:http://codevs.cn/problem/1306/ 分析:题意一看就知道就是要求Trie有多少个节点.但是如果每次单独取原串的所有子串加入Trie会超时,为什么呢?比方说AAABBBCCC,假设这样的一些串,A,AB,ABB,ABBB,ABBBC,ABBBCC,ABBBCCC,如果单独加入,那么它们的前缀都要重新查找,很浪费时间.考虑子串[l,r]和[l,r+1],完全可以在弄完[l,r]后继续第r+1个字符,就弄完了[l,r+1]. 具体的,按一定的顺序取子串: [1,1] [

Aizu 2164 CSUOJ 1436 Revenge of the Round Table

dp套一个burnside的壳子核心还是dpdp[i]表示有i个循环节时的染色方案数注意在dp的时候,不需要考虑重构的问题因为burnside会解决重构的问题dpA[i][j]表示以A开头,长度为i,结尾为j个A的合法方案数dpB[i][j]表示以B开头,长度为i,结尾为j个A的合法方案数接下来我们用dpA,dpB来计算dp[i]显然对于所有的dpB[i][1~k]都是满足dp[i]的因为它表示以B开头,以A结尾的染色方案,且结尾没有超过k个另外还有一部分就是以A开头的了假设我们在整个串的最前面

ural 1306. Sequence Median

1306. Sequence Median Time limit: 1.0 secondMemory limit: 1 MBLanguage limit: C, C++, Pascal Given a sequence of N nonnegative integers. Let's define the median of such sequence. If N is odd the median is the element with stands in the middle of the

ZSC - 1306: 沼跃鱼早已看穿了一切 - 题解

Time Limit: 1 Sec  Memory Limit: 128 MB 题目链接 : http://acm.two.moe:808/JudgeOnline/problem.php?id=1306 Description 沼跃鱼打开密码门后发现门后是一个像迷宫一样的房间,墙上的指示牌写着:房间内某处有一宝箱,但是宝箱被上锁了,钥匙在这个房间的某个角落.沼泽鱼对宝箱里有什么很感兴趣,但它必须先去拿到钥匙才可以打开宝箱.然而沼跃鱼早已看穿了一切,它看清了这个房间的布局,现在给出房间的布局图,问

rwkj 1306 素数========拓展

描述 输入二个整数a和b(2<=a<b<1000),输出a和b之间的素数. 输入 有多组数据,每组包括两个整数a和b. 输出 a和b之间的素数,每组输出一行,每个素数后面有1个空格. 样例输入 2 108 23 样例输出 2 3 5 7 11 13 17 19 23 //1306 #include<stdio.h>main(){ int a,b,max,min,n,m=0,i; while(scanf("%d%d",&a,&b)!=EOF)

POJ 1306.Combinations

Combinations Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u SubmitStatusPracticePOJ 1306 Description Computing the exact number of ways that N things can be taken M at a time can be a great challenge when N and/or M beco

URAL 1306 Sequence Median(优先队列)

题意:求一串数字里的中位数.内存为1M.每个数范围是0到2的31次方-1. 思路:很容易想到把数字全部读入,然后排序,但是会超内存.用计数排序但是数又太大.由于我们只需要第n/2.n/2+1大(n为偶数)或第(n+1)/2大(n为奇数).所以可以用优先队列来维护最值,这样只需要存一半元素(n/2+1个元素)就可以了. #include<cstdio> #include<algorithm> #include<queue> #define UL unsigned int

hihocoder 1306

http://hihocoder.com/problemset/problem/1306 题目不难,主要是我在这里学会了set的用法,其实set是可以根据自己的需求去排序的,这样还是很方便的 set<int,greater<int>>s; 这样就是对于int升序排序 这个题的主要思路也就是说 用set来记录prime和time,按照prime来排序,然后每次查询只需要查询set的两端就可以了,如果之前被删了,则删除就行,复杂度还是比较低的 1 #include <set>