HDU 6034 【贪心】

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6034

题意:

给出 N 个字符串,要求我们对每个字符映射成 0~25中的一个数字,要求最后所有字符串转换为26进制能得到的最大值。

解题思路:

统计每个字符在每一位上得贡献(用数组模拟26进制),然后按照这个模拟得26进制诸位比较, 贪心映射;

但是注意一个点就是不能出现前缀 0  的情况,所以我们要标记哪种字符可以作为前缀0哪种不可以,排序完后处理一下不满足前缀 0 的情况,最后暴力答案即可;

AC code:

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 using namespace std;
 4 const int maxn = 1e5+7;
 5 const int mod = 1e9+7;
 6 struct node{
 7     int len[maxn];
 8     int w;
 9     int v;
10     int L;
11 }p[26];
12 int n;
13 string s[maxn];
14 bool vis[26];
15 int flag[26];
16 int mmp[26];
17 int cas = 0;
18 bool cmp(node A,node B){
19     if(A.L!=B.L)return A.L<B.L;
20     for(int i=A.L;i>=0;i--){
21         if(A.len[i]==B.len[i])continue;
22         return A.len[i]<B.len[i];
23     }
24     return 0;
25 }
26 int main(){
27     while(cin>>n){
28         cas++;
29         memset(vis, 0, sizeof(vis));
30         memset(flag,0,sizeof(flag));
31         for(int i=0;i<26;i++){
32             for(int j=0;j<=p[i].L;j++){
33                 p[i].len[j]=0;
34             }
35         }
36         for(int i=0;i<26;i++){
37             p[i].v=0;
38             p[i].w=i;
39             p[i].L=-1;
40         }
41         for(int i=0;i<n;i++){
42             cin>>s[i];
43             if(s[i].size()>1){
44                 flag[s[i][0]-‘a‘]++;
45             }
46             reverse(s[i].begin(),s[i].end());
47             for(int j=0;j<s[i].size();j++){
48                 p[s[i][j]-‘a‘].len[j]++;
49                 vis[s[i][j]-‘a‘] = 1;
50             }
51         }
52         for(int i=0;i<26;i++){
53             for(int j=0;j<maxn-1;j++){
54                 if(p[i].len[j]>=26){
55                     int d = p[i].len[j]/26;
56                     p[i].len[j]%=26;
57                     p[i].len[j+1]+=d;
58                 }
59                 if(p[i].len[j]>0){
60                     p[i].L=max(p[i].L,j);
61                 }
62             }
63         }
64         sort(p,p+26,cmp);
65 //        puts("zjj");
66
67         for(int i=0;i<26;i++){
68             p[i].v=i;
69         }
70         for(int i=0;i<26;i++){
71             if(flag[p[i].w]&&p[i].v==0){
72                 swap(p[i].v,p[i+1].v);
73             }else break;
74         }
75         long long ans = 0;
76         long long value[26];
77         for(int i=0;i<26;i++){
78             value[p[i].w]=p[i].v;
79         }
80         for(int i=0;i<n;i++){
81             long long now = 1;
82             for(int j=0;j<s[i].size();j++){
83                 ans=(ans+(value[s[i][j]-‘a‘]*now)%mod)%mod;
84                 now=(now*26)%mod;
85             }
86         }
87         cout<<"Case #"<<cas<<": "<<ans<<endl;
88     }
89 }

原文地址:https://www.cnblogs.com/ymzjj/p/10804547.html

时间: 2024-11-10 15:19:48

HDU 6034 【贪心】的相关文章

HDU 6034 Balala Power!(贪心+排序)

Balala Power! Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 1411    Accepted Submission(s): 239 Problem Description Talented Mr.Tang has n strings consisting of only lower case characters.

hdu 6034 Balala Power!

题目链接:hdu 6034 Balala Power! 题意: 给你n个字符串,都是包含小写字母,现在让你给a~z赋值0~25,使得这些字符串变成的26进制的数的总和最大. 不能有前导0的情况,他们保证至少有一个字母不出现在第一位. 题解: 每个字符对答案的贡献都可以看作一个 26 进制的数字,问题相当于要给这些贡献加一个 0 到 25 的权重使得答案最大.最大的数匹配 25,次大的数匹配 24,依次类推.排序后这样依次贪心即可,唯一注意的是不能出现前导 0. 前导0的具体处理看代码. 1 #i

hdu 4105 贪心思想

淋漓尽致的贪心思想 波谷一定是一位数,波峰一位数不够大的时候添加到两位数就一定够大了的. 当在寻找波谷碰到零了就自然当成波谷. 当在寻找波峰时碰到零时,将前面的波谷加到前一个波峰上,让当前的零做波谷,使得波谷的值尽量小,这就是本题最关键的贪心思想,一直想不到. 代码中:a表示前一个值,b表示当前考虑的值,tag为偶数时表示正在寻找波谷,奇数时在寻找波峰. #include<iostream> #include<cstdio> #include<cstring> #inc

HDU 4923 (贪心+证明)

Room and Moor Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0 or 1. In order to beat him, programmer Moor has to construct another sequence B = {B1, B2,... , BN} of the same length, which satisfies that:

hdu 2037 贪心

今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 27361    Accepted Submission(s): 14439 Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋!" &quo

HDU 4932 贪心

Miaomiao's Geometry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 191    Accepted Submission(s): 38 Problem Description There are N point on X-axis . Miaomiao would like to cover them ALL by

Balala Power! HDU - 6034

Balala Power! HDU - 6034 题意:给n个字符串,让你给每一个小写字母赋一个值(0到25),使得所有的字符串的总和最大. 把每一个字符串看作一个26进制的数 先统计每个字母在不同位置出现的次数,然后按出现次数的多少排序,出现的多的自然赋大的值 注意题目要求不能有前导零,所以排序后拍到最后的那个字母如果在某个字符串首位出现过,就要和前面的换一下 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll lon

hdu 4292 贪心

http://acm.hdu.edu.cn/showproblem.php?pid=4296 Problem Description Have you ever heard the story of Blue.Mary, the great civil engineer? Unlike Mr. Wolowitz, Dr. Blue.Mary has accomplished many great projects, one of which is the Guanghua Building. T

hdu 4442 贪心

http://acm.hdu.edu.cn/showproblem.php?pid=4442 Problem Description WANGPENG is a freshman. He is requested to have a physical examination when entering the university. Now WANGPENG arrives at the hospital. Er-.. There are so many students, and the nu

hdu 1050(贪心算法)

Moving Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 19278    Accepted Submission(s): 6582 Problem Description The famous ACM (Advanced Computer Maker) Company has rented a floor of a