2019CCPC秦皇岛 I Invoker

题意:

就是魔法召唤技能,最少的符号数之类的。

思路:

线性dp题

记 dp[i][6] 为祈唤出第 i 个技能之后,身上三个法球的先后顺 序为 0 ∼ 5 的状态的最少按键数。(就是一种技能的三个发球的排列总数为6)

转移就暴力枚举上一个技能的结尾状态,然后算一下有几个 法球是可以重复使用的,取个最优值就行了。

预处理一下第i种技能的排列为z1的时候转移到第j种技能状态为z2需要的步数数组dis

写一下全排列,然后多写函数结构化程序,实现也是较为简单的。

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 2e5 + 10;
int dis[10][10][6][6];
const int INF = 0x3f3f3f3f;
ll dp[N][6];
int get_id(char ch) {
    if (ch == ‘Y‘)return 0;
    if (ch == ‘V‘)return 1;
    if (ch == ‘G‘)return 2;
    if (ch == ‘C‘)return 3;
    if (ch == ‘X‘)return 4;
    if (ch == ‘Z‘)return 5;
    if (ch == ‘T‘)return 6;
    if (ch == ‘F‘)return 7;
    if (ch == ‘D‘)return 8;
    if (ch == ‘B‘)return 9;
}
string str[10] = { "QQQ","QQW","QQE","WWW","QWW","WWE","EEE","QEE","WEE","QWE" };
string get_string(int id, int num) {
    string s = str[id];
    string ans;
    int p[3] = { 0,1,2};
    int cnt = 0;
    do {
        if (cnt++ == num) {
            //ans=str[id][0]+str[id][1] + str[id][2];
            ans.push_back(str[id][p[0]]);
            ans.push_back(str[id][p[1]]);
            ans.push_back(str[id][p[2]]);
            return ans;
        }
    }while(next_permutation(p, p + 3));
}
int get_val(string s1, string s2) {
    if (s1 == s2)return 0;
    if (s1[1] == s2[0] && s1[2] == s2[1])return 1;
    if (s1[2] == s2[0])return 2;
    return 3;
}
void init(){
    string s1, s2;
    for(int i=0;i<10;i++)
        for (int j = 0; j < 10; j++) {
            for(int z1=0;z1<6;z1++)
                for (int z2 = 0; z2 < 6; z2++) {
                    s1 = get_string(i, z1); s2 = get_string(j, z2);
                    dis[i][j][z1][z2] = get_val(s1, s2);
                }
        }
}
char s[N];
int n;
int main() {
    while (~scanf("%s", &s)) {
//(hdu上面必须加多组输入)
        n = strlen(s);
        for (int i = 1; i < n; i++)
            for (int j = 0; j < 6; j++)
                dp[i][j] = INF;
        init();
        for (int i = 0; i < 6; i++)dp[0][i] = 4;
        int id1, id2;
        for (int i = 1; i < n; i++) {
            id1 = get_id(s[i - 1]); id2 = get_id(s[i]);
            for (int j = 0; j < 6; j++)
                for (int k = 0; k < 6; k++) {
                    dp[i][j] = min(dp[i][j], dp[i - 1][k] + dis[id1][id2][k][j] + 1);
                }
        }
        ll ans = dp[n - 1][0];
        for (int i = 1; i < 6; i++) {
            ans = min(ans, dp[n - 1][i]);
        }
        printf("%lld\n", ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/gzr2018/p/11605385.html

时间: 2024-11-04 22:34:05

2019CCPC秦皇岛 I Invoker的相关文章

2019-ccpc秦皇岛现场赛

https://www.cnblogs.com/31415926535x/p/11625462.html 昨天和队友模拟了下今年秦皇岛的区域赛,,,(我全程在演 题目链接 D - Decimal 签到题,,,(感觉在cf上做过,, (然后写反输出白白wa一发,,,,,emmmmmmmm F - Forest Program 这题我感觉是第二道签到题,,,很简单,,但是我一个人读完题后就想着怎么写代码,,,然后wa了无数发才反应过来还要考虑树边的情况,,,丧失理智 ,,,, 题意就是给一个 仙人掌

2019CCPC秦皇岛赛区

目录 Solutions F. Forest Program I. Invoker J. MUV LUV EXTRA Link Solutions F. Forest Program 题意: 思路: dfs+栈 判环 设图中环的大小分别为 \(c_1\) \(c_2\), ..., \(c_k\),不属于任何一个环的边数为 \(b\),则答案为: \(2^b*\prod _{i=1}^{k}{(2^{c_i}-1)}\) dfs 判环时 各点入栈 若点已存在于栈中 则存在环 计算环大小即可 不必

Forest Program(2019ccpc秦皇岛F)

题:http://acm.hdu.edu.cn/showproblem.php?pid=6736 题意:删掉一些边使得图不存在点双,求方案数. 分析:若一条边不属于点双,那么这条边有删和不删俩种选择,若找到点双,点双中必须删掉一条边(题目有保证一条边只能属于一个点双,所以不用担心一条边用于多个点双)tarjan找点双,若为点双则必须删掉点双中的一条边 #include<bits/stdc++.h> using namespace std; typedef long long ll; #defi

【2019CCPC秦皇岛:A】Angle Beats 分类讨论 (unordered_map 加 hash)

题意:n个给定点,q个询问点,每次询问给出一个坐标A,问从n中选定两个点B,C,有多少种方案使得ABC是个直角三角形. 思路:直角三角形能想的就那几个,枚举边,枚举顶点,这个题都行,写的枚举顶点的,A点分两种情况,1是直角,2是非直角.防止误差,用分数表示斜率,然后用了map<pair<int,int> int> 发现t了,改成unordered_map发现这个unordered_map只能映射一个,即unordered_map<ll, int>,所以得用到hash,把

个人日常训练计划

日期 名称 2019-09-26 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 2018) 2019-09-27  浅学模拟退火 2019-09-28  Codeforces 几何 1700+ pt1(5/26)+  2019CCPC秦皇岛赛区(重现赛)- 感谢东秦&复旦 2019-09-29  Codeforces 几何 1700+ pt1(11/26)+ Codeforces Roun

秦皇岛站2019CCPC A.Angel Beats

题意:平面内给定n个点,q次询问,给次给定一个点P,问这个点与平面内n个点可以组成多少直角三角形,其中(n+q)个点互不相等 思路: 分别考虑P点作直角顶点和非直角顶点.这个题思路很简单,就是看如何实现简单而且不会tle!!! 对于直角顶点和非直角顶点代码都比较简单,求后者有点离线的思想. 这里想说的就是map的用法,自定义小于运算符,使得在map中查找的时候,统一斜率的向量都会加起来,虽然在map中依然会保存多个不同的向量.(听说是现场一血的写法,中山大学大佬nb) 算法复杂度大概n*n*lo

2014-7-5~6 秦皇岛之旅,带思杨看大海

两天的秦皇岛之旅告一段落.开心与疲惫齐飞. 周六早晨 7:30从家出发去北京站,动车北京出发到秦皇岛.11:30到秦皇岛.一路直达,北戴河一站,再没有停过.然后34路去燕山大学-静的母校附近吃肚子,找订的宾馆.--- 他们学校对面的街道几乎被拆毁了,跟她的印象不一样了.只好另找吃的,结果把订的宾馆找到了.放行李,简单修改,就在宾馆下面的饭馆点菜吃饭.那分量,真大,三个人吃了一半,剩下的带走了,虽然最后还是被 浪费了. 吃过饭,去宾馆修改,换衣服.走路去燕大对面的海碧台海滩玩.沙滩不错.天有点多云

不能错过的徒步欢乐:从秦皇岛到北戴河

国庆第三天,坤哥 从秦皇岛沿着渤海西岸边(东岸在哪里?),跑到北戴河. 有几年没看到真正的大海了,今天再次看到. 出发时: 很棒的木板路,统一样式,从秦皇岛一直铺到北戴河,除了中间的几处中断: 继续跑,有时不得不进入沙区: 到了很美的"三角洲": 继续跑,这里有种前进的豪迈感: 这张就像是我从空中俯拍海岸线.也联想到2008年我去印度时在印度洋边的情景,印度洋海啸夺去了20万的生命: 继续跑,看到另一片风景: 停下来检查一下自己的精神状态,还不错: 一直指引着我路线的木板路中断了,进入

2016全国高校大数据专业师资培训班在秦皇岛成功举办

2016年7月29日,由中国电子学会嵌入式系统与机器人分会主办的2016全国高校大数据专业师资培训班(暑假)在河北.秦皇岛河北科技师范学院圆满落幕. 本期师资培训班从7月22日开始,为期8天,河北科技师范学院作为协办方为培训班提供了培训场地,而作为承办方的北京奇观技术有限责任公司以及北京博创智联科技有限公司提供了培训使用的实验设备.大数据教学实验系统以及云计算.大数据领域内的优秀讲师和强大的技术支持团队. 本期培训课程内容是针对全国高校计算机方向量身定制的,涵盖了系统安装配置.提供上层编程API