2017 Multi-University Training Contest - Team 1—HDU6033&&HDU6034

HDU6033  Add More Zero

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6033

题目意思:给一个m,求一个数k使得10^k最接近2^m-1(不超过2^m-1),首先明确一点不存在10^k=2^m-1或者2^m,自己拿计算机随机算算就知道了,那现在我们只要知道2^m-1转成10进制是一个多少位的数,那么k就是多少,对2^m-1对10做对数运算算log10(2^m-1),m很大的时候2^m-1非常接近于2^m而且我们也说了不存在10^k=2^m-1或者2^m。所以log(2^m)=mlog10(2),直接算出这个数,向下取整就好了。

代码:

 1 //Author: xiaowuga
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <set>
 5 #include <vector>
 6 #include <queue>
 7 #include <cmath>
 8 #include <cstring>
 9 #include <cstdio>
10 #include <ctime>
11 #include <map>
12 #include <bitset>
13 #include <cctype>
14 #define maxx INT_MAX
15 #define minn INT_MIN
16 #define inf 0x3f3f3f3f
17 #define mem(s,ch) memset(s,ch,sizeof(s))
18 #define da cout<<da<<endl
19 #define uoutput(a,i,l,r) for(int i=l;i<r;i++) if(i==l) cout<<a[i];else cout<<" "<<a[i];cout<<endl;
20 #define doutput(a,i,l,r) for(int i=r-1;i>=0;i--) if(i==r-1) cout<<a[i];else cout<<" "<<a[i];cout<<endl;
21 const long long N= 100;
22 using namespace std;
23 typedef long long LL;
24 int main() {
25     ios::sync_with_stdio(false);cin.tie(0);
26     LL m;
27     int c=0;
28     while(cin>>m){
29         cout<<"Case #"<<++c<<": ";
30         cout<<floor(m*log10(2))<<endl;
31     }
32     return 0;
33 }
View Code

HDU6034  Balala Power!

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6034

题目意思:给你n个字符串,由小写字母组成,让你对这个每个字母赋值(0-25,每个数字只能用一次),问你怎么样赋值才能让最后形成的二十六进制的数转成十进制这些数的和最大。算出这个数mod1e9+7。字符串的长度的总和可以是十万,每个字符串长度的上限就是十万。可能高达十万位的二十六进制的数,赋值的时候还要小心前导零。

思路:我们计算每个字母在第i位上的数量(这里声明一下第i为表示这个字母对总和的贡献是bit[i]*26^i)。我们把所有的字符串扫一遍计算他所有字母的贡献,通过判断他在某些位上出现的次数。来比较他们他的大小,然后赋值,对于前导零,我们需要判断是否26个字母都出现了。如果都出现了,我们需要判断最后被赋值为0的那个字母是否作为其中一个字符串的首字母出现过,反向找到第一个不在首字母出现过的字母把它赋值为0,然后再从大到小赋值,遇到这个字母我们跳过就好了。

对于排序,我们可以记录一个字母出现的最高位是多少。先通过比较最高位,比完以后,我们在从高位按位比较,高位可以决定大小而低位不一定可以决定大小,因为高位的基数大。

代码:

  1 //Author: xiaowuga
  2 #include <iostream>
  3 #include <algorithm>
  4 #include <set>
  5 #include <vector>
  6 #include <queue>
  7 #include <cmath>
  8 #include <cstring>
  9 #include <cstdio>
 10 #include <ctime>
 11 #include <map>
 12 #include <bitset>
 13 #include <cctype>
 14 #define maxx INT_MAX
 15 #define minn INT_MIN
 16 #define inf 0x3f3f3f3f
 17 #define mem(s,ch) memset(s,ch,sizeof(s))
 18 #define da cout<<da<<endl
 19 #define uoutput(a,i,l,r) for(int i=l;i<r;i++) if(i==l) cout<<a[i];else cout<<" "<<a[i];cout<<endl;
 20 #define doutput(a,i,l,r) for(int i=r-1;i>=0;i--) if(i==r-1) cout<<a[i];else cout<<" "<<a[i];cout<<endl;
 21 const long long N=100000+5;
 22 const long long mod=1e9+7;
 23 using namespace std;
 24 typedef long long LL;
 25 int n;
 26 struct Bit{
 27     int s[N];
 28     char ch;
 29     bool operator <(const Bit &m)const{
 30         if(s[0]!=m.s[0]) return s[0]>m.s[0];
 31         else{
 32             for(int i=s[0];i>=1;i--){
 33                 if(s[i]==m.s[i]) continue;
 34                 else return s[i]>m.s[i];
 35             }
 36             return 0;
 37         }
 38     }
 39 }bit[26];
 40 string q[N];
 41 LL mi[N];
 42 int vis[26],ct,inhead[N],w[N];
 43 void init(){
 44     mi[0]=1;
 45     for(int i=1;i<N;i++){
 46         mi[i]=mi[i-1]*26%mod;
 47     }
 48 }
 49 int main() {
 50     ios::sync_with_stdio(false);cin.tie(0);
 51     init();
 52     int c=0;
 53     while(cin>>n){
 54         for(int i=0;i<26;i++) {mem(bit[i].s,0);bit[i].ch='a'+i;}
 55         mem(vis,0);ct=0;
 56         mem(inhead,0);
 57         mem(w,0);
 58         for(int i=0;i<n;i++) {cin>>q[i]; if(q[i].size()!=1) inhead[q[i][0]-'a']=1;}
 59         for(int i=0;i<n;i++){
 60             int len=q[i].size();
 61             for(int j=len-1;j>=0;j--){
 62                 int t=q[i][j]-'a';
 63                 if(!vis[t]){vis[t]=1;ct++;}
 64                 bit[t].s[len-j]++;
 65                 if(bit[t].s[len-j]>=26){
 66                     bit[t].s[len-j]=0;bit[t].s[len-j+1]++;
 67                     bit[t].s[0]=max(bit[t].s[0],len-j+1);
 68                 } 
 69                 bit[t].s[0]=max( bit[t].s[0],len-j);
 70             }
 71         }
 72         sort(bit,bit+26);
 73         if(ct<26){
 74             int now=25;
 75             for(int i=0;i<ct;i++) w[bit[i].ch-'a']=now--;
 76         }
 77         else{
 78             int flag=-1;
 79                 for(int i=25;i>=0;i--){
 80                     if(inhead[bit[i].ch-'a']==0){
 81                         flag=i; break;
 82                     }
 83                 } 
 84             int now=25;
 85             for(int i=0;i<26;i++){
 86                 if(flag==i) {w[bit[i].ch-'a']=0;continue;}
 87                 else w[bit[i].ch-'a']=now--;
 88             }
 89         }
 90         LL sum=0;
 91         for(int i=0;i<n;i++){
 92             int len=q[i].size();
 93             int x=0;
 94             for(int j=len-1;j>=0;j--){
 95                 LL t=mi[x++]*w[q[i][j]-'a']%mod;
 96                 sum=(sum+t)%mod;
 97             }
 98         }
 99         //cout<<ct<<endl;
100         cout<<"Case #"<<++c<<": "; 
101         cout<<sum<<endl;
102     }
103     return 0;
104 }
View Code

 

转载于:https://www.cnblogs.com/xiaowuga/p/7260273.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值