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),直接算出这个数,向下取整就好了。
代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
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,然后再从大到小赋值,遇到这个字母我们跳过就好了。
对于排序,我们可以记录一个字母出现的最高位是多少。先通过比较最高位,比完以后,我们在从高位按位比较,高位可以决定大小而低位不一定可以决定大小,因为高位的基数大。
代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }