zoukankan      html  css  js  c++  java
  • 2017 Multi-University Training Contest

    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
  • 相关阅读:
    宠物收养场 Treap
    最佳课题选择
    [USACO08JAN]手机网络Cell Phone Network
    [USACO09MAR]地震损失2Earthquake Damage 2
    字符串距离 简单DP
    小行星群 网络流 二分图
    游览牧场 最小费用流
    BZOJ1391: [Ceoi2008]order
    BZOJ1570: [JSOI2008]Blue Mary的旅行
    BZOJ2243: [SDOI2011]染色
  • 原文地址:https://www.cnblogs.com/xiaowuga/p/7260273.html
Copyright © 2011-2022 走看看