【2017 Multi-University Training Contest - Team 1 1002】Balala Power!
【Link】:http://acm.hdu.edu.cn/showproblem.php?pid=6034
【Description】
给你n个字符串;
每个字符串都仅由小写字母组成;
然后,你可以把每个小写字母都映射成0..25中的任意一个数字;
(两个不同的字母不能映射成相同数字);
组成的26进制数;
问这n个26进制数的最大和是多少;
【Solution】
记录每个字母在哪一位上出现过多少次;
->其实就是记录每个字母在某些位权上的系数;
然后;
把占的位权总和最多的字母优先往前放就好;
可以用一个vector< int > v来完成比较的过程;
v的大小设置为MAXN=105;
这样就能记录每个字母在某一位上的位权了;
(最右边是最低位权,代表26^0)
这样就能按照类似字符串的比较方式进行比较了;
把大的字母放在前面即可;(没必要知道是哪个字母,直接乘上答案就好);
做的时候,每一位都要进位;
这样才能用字符串的比较方式进行比较;
直接用sort会超时;
用冒泡排序;
记录每个字母的最高位权;
如果最高位权不一样;
则直接比较最高位权就好;
这样就没必要整个MAXN的vector都同时比较了;
因为不能有前导0;
所以在做的时候;
需要知道哪些字母是能够为0的;
(长度大于1的字符串的开头字母都不能为0)
做的时候,从最末尾开始,往前找最小的位权,且能够为0;把它放到末尾(表示替换成0);
然后再从后往前整体向左移动一位;
这样能保证合法的情况下最大;
【NumberOf WA】
10+
【Reviw】
贪心那一块没有好好想,错了好几次;
然后最高位权不相同直接判大小的优化也没有一开始就加;
挺挣扎的一道题吧.
【Code】
#include <vector>
#include <cstring>
#include <cstdio>
#define int long long
using namespace std;
const int MAXN =1e5+5;
const int INF = 0x3f3f3f3f;
const int M = 1e9+7;
struct node{
vector <int> v;
int ok,mi;
}ar[30];
bool cmp(node a,node b)
{
return a.v>b.v;
}
char s[MAXN];
int mm[MAXN];
int n;
main()
{
//freopen("F:\\rush.txt","r",stdin);
//ios::sync_with_stdio(false);
mm[0] = 1;
for (int i = 1;i <= MAXN-1;i++)
mm[i] = (1LL*mm[i-1]*26)%M;
int ww = 0;
for (int i = 0;i <= 25;i++){
ar[i].v.resize(MAXN);
for (int j = 0;j <= MAXN-1;j++)
ar[i].v[j] = 0;
}
while(~scanf("%lld",&n))
{
for (int i = 0;i <= 25;i++){
for (int j = 0;j <= MAXN-1;j++)
ar[i].v[j] = 0;
ar[i].ok = 0;
ar[i].mi = INF;
}
while(n--)
{
scanf("%s",s);
int len = strlen(s);
if(len!=1)
ar[s[0]-'a'].ok=1;
for(int i=len-1,ji=MAXN-1;i>=0;i--,ji--)
{
int ind = s[i]-'a';
ar[ind].v[ji]++;
}
}
for (int i = 0;i <= 25;i++){
for (int j = MAXN-1;j>=1;j--){
if (ar[i].v[j]>25){
ar[i].v[j-1]+=ar[i].v[j]/26;
ar[i].v[j]%=26;
}
}
for (int j = 0;j <= MAXN-1;j++)
if (ar[i].v[j]){
ar[i].mi = j;
break;
}
}
bool ok = false;
while (!ok){
ok = true;
for (int i = 0;i <= 24;i++)
if (ar[i].mi > ar[i+1].mi || (ar[i].mi == ar[i+1].mi && ar[i].v < ar[i+1].v)){
swap(ar[i],ar[i+1]);
ok = false;
}
}
int i;
for(i=25;i>=0;i--)
{
if(!ar[i].ok)break;
}
node temp = ar[i];
for (int j = i;j<=24;j++)
ar[j] = ar[j+1];
ar[25] = temp;
int ans = 0;
for(int i=0,j=25;i<=25;i++,j--){
int temp = 0;
for (int k = 0,l = MAXN-1;k <= MAXN-1;k++,l--)
temp= (temp + (mm[l]*ar[i].v[k])%M)%M;
ans = (ans + 1LL*temp*j%M)%M;
}
printf("Case #%lld: %lld\n",++ww,ans);
}
return 0;
}
【2017 Multi-University Training Contest - Team 1 1002】Balala Power!的更多相关文章
- 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】
Ch’s gift Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1002&&hdu 6034
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 【2017 Multi-University Training Contest - Team 1 1011】KazaQ's Socks
[Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6043 [Description] 一个人壁橱里有n双袜子,每天早上取一双最小下标的袜子,然后晚上放 ...
- 【2017 Multi-University Training Contest - Team 1 1001】Add More Zero
[Link]: [Description] 让你求最大的k; 使得 10^k<=2^m-1 [Solution] 求出2^m-1的位数就好; [lg(2^m-1)] = lg(2^m) = m* ...
- 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】
Function Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
Dying Light Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
CSGO Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
随机推荐
- oracle 11g RAC手动卸载grid,no deinstall
1.通过root用户进入到grid的ORACLE_HOME [root@db01]# source /home/grid/.bash_profile [root@db01]# cd $ORACLE_H ...
- github如何多人开发一个项目
github如何多人开发一个项目 一.总结 一句话总结:a.点项目里面的Settings->Collaborators,来添加参与者(比如github用户名), b.向他发送项目的link,让他 ...
- springBoot 打war包 程序包com.sun.istack.internal不存在的问题
使用的是 idea - Lifecycle-package 的方式打包(maven) 确认 <packaging>war</packaging> 修改启动类: (原启动类) ...
- Map, filter and reduce
To add up all the numbers in a list, you can use a loop like this: Total is initialized to 0. Each t ...
- 4.bind绑定
#include <iostream> #include <string> #include <boost/bind.hpp> #include <boost ...
- UI Framework-1: Aura Focus and Activation
Focus and Activation Focus and Activation are closely related. Definitions Focused window - this i ...
- POJ-2393 Yogurt factory 贪心问题
题目链接:https://cn.vjudge.net/problem/POJ-2393 题意 有一个生产酸奶的工厂,还有一个酸奶放在其中不会坏的储存室 每一单元酸奶存放价格为每周s元,在接下来的N周时 ...
- 使用PXE+NFS EFI引导安装RHEL6/7以及Kickstart安装
PXE引导的步骤: 1.开机后选择网络启动,client端向server端的dhcpd发起获取IP地址的dhcp请求. 2.server端分配IP后,dhcpd会同时根据其配置文件,通过TFTP协议发 ...
- HTML学习----------DAY2第四节
HTML 文档是由 HTML 元素定义的. HTML 元素 HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码. 注释:开始标签常被称为开放标签(opening ...
- 洛谷 P1952 火星上的加法运算_NOI导刊2009提高(3)
P1952 火星上的加法运算_NOI导刊2009提高(3) 题目描述 最近欢欢看到一本有关火星的书籍,其中她被一个加法运算所困惑,由于她的运算水平有限.她想向你求助,作为一位优秀的程序员,你当然不会拒 ...