Codeforces 761C Dasha and Password(枚举+贪心)

题目链接 Dasha and Password

题目保证一定有解。

考虑到最多只有两行的指针需要移动,那么直接预处理出该行移动到字母数字或特殊符号的最小花费。

然后O(N^3)枚举求最小值即可。

时间复杂度O(N*M+N^3)

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 #define REP(i,n)                for(int i(0); i <  (n); ++i)
 6 #define rep(i,a,b)              for(int i(a); i <= (b); ++i)
 7 #define dec(i,a,b)              for(int i(a); i >= (b); --i)
 8 #define for_edge(i,x)           for(int i = H[x]; i; i = X[i])
 9 #define INF            1    <<    30
10
11 const int N     =    100000      +       10;
12 const int M     =    10000       +       10;
13 const int Q     =    100       +       10;
14 const int A     =    30          +       1;
15
16
17 int a[Q][Q], c[Q][10], v[Q][10]; char s[Q];
18 int n, m, ans;
19
20 int main(){
21
22     scanf("%d%d", &n, &m);
23     rep(i, 1, n){
24         scanf("%s", s + 1);
25         rep(j, 1, m){
26             if (s[j] >= ‘0‘ && s[j] <= ‘9‘) a[i][j] = 1;
27             else if (s[j] >= ‘a‘ && s[j] <= ‘z‘) a[i][j] = 2;
28             else if (s[j] == ‘&‘ || s[j] == ‘*‘ || s[j] == ‘#‘) a[i][j] = 3;
29         }
30     }
31
32     rep(i, 1, n) rep(j, 1, 3) c[i][j] = INF;
33
34     rep(i, 1, n){
35         rep(j, 1, m){
36             v[i][a[i][j]] = 1;
37             c[i][a[i][j]] = min(c[i][a[i][j]], min(abs(j - 1), abs(m - j) + 1));
38         }
39     }
40
41
42     ans = INF;
43     rep(i, 1, n - 2){
44         rep(j, i + 1, n - 1){
45             rep(k, j + 1, n){
46                 if (v[i][1] && v[j][2] && v[k][3]) ans = min(ans, c[i][1] + c[j][2] + c[k][3]);
47                 if (v[i][1] && v[j][3] && v[k][2]) ans = min(ans, c[i][1] + c[j][3] + c[k][2]);
48                 if (v[i][2] && v[j][1] && v[k][3]) ans = min(ans, c[i][2] + c[j][1] + c[k][3]);
49                 if (v[i][2] && v[j][3] && v[k][1]) ans = min(ans, c[i][2] + c[j][3] + c[k][1]);
50                 if (v[i][3] && v[j][1] && v[k][2]) ans = min(ans, c[i][3] + c[j][1] + c[k][2]);
51                 if (v[i][3] && v[j][2] && v[k][1]) ans = min(ans, c[i][3] + c[j][2] + c[k][1]);
52             }
53         }
54     }
55
56     printf("%d\n", ans);
57     return 0;
58
59 }
时间: 2024-10-24 08:57:33

Codeforces 761C Dasha and Password(枚举+贪心)的相关文章

[Codeforces 1295E]Permutation Separation(线段树+贪心)

[Codeforces 1295E]Permutation Separation(线段树+贪心) 题面 给出一个排列\(p_1,p_2,...p_n\).初始时你需要选择一个位置把排列分成左右两个.然后在两个序列间移动元素使得左边序列的所有元素都比右边的所有元素小.给出每个元素\(p_i\)从一个序列移动到另一个序列的代价\(a_i\). 分析 显然最后得到的序列是小的数在一边,大的数在另一边.设从值为\(i\)的元素处分开之后移动代价为\(ans_i\). 一开始假设所有数都移到右边序列,那么

Codeforces 583 DIV2 Robot&#39;s Task 贪心

原题链接:http://codeforces.com/problemset/problem/583/B 题意: 就..要打开一个电脑,必须至少先打开其他若干电脑,每次转向有个花费,让你设计一个序列,使得总花费最小. 题解: 就傻傻的走就好..从左走到右,再走回来,更新序列和答案就好. 代码: #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #define MA

Codeforces 442C Artem and Array(stack+贪心)

题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数,删除一个数的得分为两边数的最小值,如果左右有一边不存在则算作0分.问最大得分是多少. 解题思路:首先将连续的a,b,c,a > b && c > b的情况将c掉,获得min(a,b)分,这样处理后数组变成一个递増再递减的序列,除了最大和第二大的取不到,其他数字均可以得分. 样例:4 10 2 2 8 #include <cstdio> #include

Codeforces 18D Seller Bob java大数+贪心

题目链接:点击打开链接 java: import java.math.BigInteger; import java.util.Scanner; public class Main { static int N = 5005; static BigInteger[] er = new BigInteger[N]; static BigInteger E = new BigInteger("2"); static int[] a = new int[N]; static int[] ma

Codeforces 437C The Child and Toy(贪心)

题目连接:Codeforces 437C The Child and Toy 题目大意:孩子有一个玩具,有n个部件组成,m条绳子组成,每条绳子连接两个部件.小孩比较顽皮,要将玩具拆成不可分割的部件,每次剪断一条绳子的代价是该绳子连接的两个部件的权值中较小的值.问说最小的总代价是多少. 解题思路:以为每条边都是要被剪断的,所以将节点按照代价值从大到小排序,每次拿掉权值大的点,与该点连接并且还未剪断的边均用另外点的权值. #include <cstdio> #include <cstring

Codeforces 437D The Child and Zoo(贪心+并查集)

题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去参观动物园,动物园分很多个区,每个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路的权值为该条路连接的两个区中权值较小的一个.如果两个区没有直接连接,那么f值即为从一个区走到另一个区中所经过的路中权值最小的值做为权值.问,平均两个区之间移动的权值为多少. 解题思路:并查集+贪心.将所有的边按照权值排序,从最大的开始连接,每次连接时计算的次数为连接两块的节点数的积(乘法原理). #in

枚举+贪心 HDOJ 4932 Miaomiao&#39;s Geometry

题目传送门 1 /* 2 题意:有n个点,用相同的线段去覆盖,当点在线段的端点才行,还有线段之间不相交 3 枚举+贪心:有坑点是两个点在同时一条线段的两个端点上,枚举两点之间的距离或者距离一半,尽量往左边放,否则往右边放, 4 判断一下,取最大值.这题二分的内容少 5 */ 6 #include <cstdio> 7 #include <algorithm> 8 #include <cstring> 9 #include <cmath> 10 using n

Codeforces 459E Pashmak and Graph(dp+贪心)

题目链接:Codeforces 459E Pashmak and Graph 题目大意:给定一张有向图,每条边有它的权值,要求选定一条路线,保证所经过的边权值严格递增,输出最长路径. 解题思路:将边按照权值排序,每次将相同权值的边同时加入,维护每个点作为终止点的最大长度即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 3

Codeforces Round #546 (Div. 2) D 贪心 + 思维

https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则,假如u在v相邻前面,那么u和v可以交换位置,问你是队列最后一个人的时候你最前可以换到前面哪里 题解 因为相邻才能换,所以最后一个换到前面一定是一步一步向前走,所以不存在还要向后走的情况 设最后一个为u,假设前面有一个能和u换位置的集合,那么需要将这些点尽量往后移动去接u 假设前面有一个不能和u换位置的集合S,