无尽走廊
Time Limit: 1000MS Memory limit: 65536K
题目描述
2006年,我们可以称之为“帆“船年。一艘艘友谊的小船都在这一年翻掉了(当然也有升华为巨轮的)。然而这种事注定与小鱼无缘,就在不久前,小鱼与小驴刚吵了一架,在争吵的过程中,小鱼与小驴友谊的小木船失衡翻掉了。小鱼与小驴坠入大海,小鱼醒来后发现小驴不见了,慌张的小鱼四处寻找小驴,但小鱼发现小驴并不在小鱼身边。此时小鱼发现自己在一个大大的走廊尽头,走廊那边是无尽的黑暗,而小鱼身旁的一个告示牌上有如下内容:
亲爱的人类啊~欢迎来到海洋之邸~想要找到你的朋友么~那就穿越这条无尽走廊吧~下面有一张魔法地图~可以带你通向海底堡~你的朋友就在那里等着你那~下面有一张魔法地图~可以带你离开这里~
小鱼捡起地图,发现这条走廊是由好几条小走廊组成,地图上每条小走廊由一个大写英文字母表示。而小鱼现在在第一个字母处,出口在最后一个字母。
地图上说,每个小走廊都有一扇时空之门,可以跳转到当前走廊往后第1~k个走廊处。而所需要的时间为两走廊字母编号的距离。譬如A走廊与B走廊间花费为1 Z与A花费为25 C与A花费为2。
小鱼现在十分后悔跟小驴吵架。急切地想要找到小驴,你能帮小鱼算出一种方案,能够尽快找到小驴么?
亲爱的人类啊~欢迎来到海洋之邸~想要找到你的朋友么~那就穿越这条无尽走廊吧~下面有一张魔法地图~可以带你通向海底堡~你的朋友就在那里等着你那~下面有一张魔法地图~可以带你离开这里~
小鱼捡起地图,发现这条走廊是由好几条小走廊组成,地图上每条小走廊由一个大写英文字母表示。而小鱼现在在第一个字母处,出口在最后一个字母。
地图上说,每个小走廊都有一扇时空之门,可以跳转到当前走廊往后第1~k个走廊处。而所需要的时间为两走廊字母编号的距离。譬如A走廊与B走廊间花费为1 Z与A花费为25 C与A花费为2。
小鱼现在十分后悔跟小驴吵架。急切地想要找到小驴,你能帮小鱼算出一种方案,能够尽快找到小驴么?
输入
多组输入。
先输入一个整数T,表示组数。
之后每组先输入一个字符串(0 < 串长 <= 10^4),之后输入一个整数k(1 <= k <= 串长)表示每次最远移动距离。
每组输入占一行,以空格隔开。
先输入一个整数T,表示组数。
之后每组先输入一个字符串(0 < 串长 <= 10^4),之后输入一个整数k(1 <= k <= 串长)表示每次最远移动距离。
每组输入占一行,以空格隔开。
输出
对于每组输入,输出一个正整数表示小鱼找到小驴的最短时间。每组输出占一行。
示例输入
3 ACA 1 ACA 2 ABCA 2
示例输出
4 0 2
提示
对于第二组输入,在第一个走廊处往后移动两步,到达尽头。
对于第三组输入,在第一个走廊处先移动一步到达第二个走廊,再移动两步到达尽头,时间最短。
对于第三组输入,在第一个走廊处先移动一步到达第二个走廊,再移动两步到达尽头,时间最短。
来源
“师创杯”山东理工大学第八届ACM程序设计竞赛
示例程序
- 提交
- 状态
- 分析题意我们可以知道对于当前点pos的最优决策来至 pos-k~pos-1之中由于一共就26个字母,我们可以维护这26个字母在不同区间是否可达和其最优解,利用multiset就可以搞一搞了
- ACcode:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define maxn 10002 #include <set> using namespace std; char str[maxn]; int sum[maxn]; int dp[maxn]; int loop,k,len; int main(){ scanf("%d",&loop); while(loop--){ scanf("%s%d",str+1,&k); len=strlen(str+1); for(int i=1;i<=len;++i)sum[i]=str[i]-'A'; memset(dp,0,sizeof(dp)); multiset <int> q[26]; q[str[1]-'A'].insert(0); for(int i=2;i<=len;++i){ int ans=0x3f3f3f3f; for(int j=0;j<26;++j) if(!q[j].empty()) ans=min(ans,*(q[j].begin())+abs(sum[i]-j)); dp[i]=ans; if(i>k) q[sum[i-k]].erase(q[sum[i-k]].find(dp[i-k])); q[sum[i]].insert(dp[i]); } printf("%d\n",dp[len]); } return 0; } /************************************** Problem id : SDUT OJ E User name : acmer Result : Accepted Take Memory : 1056K Take Time : 230MS Submit Time : 2016-06-01 23:33:46 **************************************/
版权声明:本文为zp___waj原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。