2017 Multi-University Training Contest - Team 1

多校第一场,挺紧张的。出了很多小状况,但是好在问题不是特别大。


T1队友题目意思都错了,做了很久没有动静。

1001 Add More Zero

找出最大  k k 满足  10k<2m 10k<2m 两边取对数移项得  k<mlog(2)log(10) k<mlog(2)log(10). 所以答案为  mlog(2)log(10) ⌊mlog(2)log(10)⌋.

#include<cstdio>
#include<cmath>
using namespace std;


int main()
{
int m,x=0;
while (scanf("%d",&m)!=EOF)
{
x++;
int ans=(int)(m*log(2)/log(10));
printf("Case #%d: %d\n",x,ans);
}
}

T2 最大映射修改一下权值的判断即可(需要注意前导0的处理)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;


struct L {
    int m[100100];


    L() {
        memset(m, 0, sizeof(m));
    }
};


char s[100010];
int k[30];
int i, j, l, n, maxl;
L a[26];
ll ans, tmp;
bool us[30];


inline bool cmp(int x, int y) {
    int i;
    if (a[x].m[0] != a[y].m[0])
        return a[x].m[0] > a[y].m[0];
    for (i = a[x].m[0]; i > 0; --i)
        if (a[x].m[i] != a[y].m[i])
            return a[x].m[i] > a[y].m[i];
    return 0;
}


int main() {
    int T = 0;
    while (~scanf("%d", &n)) {
        memset(us, 0, sizeof(us));
        for (i = 0; i <= 25; ++i)
            memset(a[i].m, 0, sizeof(a[i].m));
        while (n--) {
            scanf("%s", s);
            l = strlen(s);
            us[s[0] - 'a'] = 1;
            for (i = 0; i < l; ++i) {
                a[s[i] -'a'].m[l - i]++;
                a[s[i] -'a'].m[0] = max(a[s[i] -'a'].m[0], l-i);
            }
        }
        
        maxl = 0;


        for (i = 0; i <= 25; ++i) {
            k[i] = i;
            for (j = 1; j <= a[i].m[0]; ++j) {
                a[i].m[j+1] += a[i].m[j] / 26;
                a[i].m[j] %= 26;
            }
            while (a[i].m[a[i].m[0] + 1] != 0) {
                ++a[i].m[0];
                a[i].m[a[i].m[0] + 1] = a[i].m[a[i].m[0]] / 26;
                a[i].m[a[i].m[0]] %= 26;
            }
            maxl = max(maxl, a[i].m[0]);
        }
        sort(k, k + 26, cmp);
        ans = 0;
        tmp = 1;
        int ze = 25;
        while (us[k[ze]] && ze > 0)
            ze--;
        for (i = ze; i <= 25; ++i)
            k[i] = k[i+1];


        for (i = 1; i <= maxl; ++i) {
            for (j = 0; j < 25; ++j) {
                ans += (ll)(25 - j) * tmp * a[k[j]].m[i] % mod;
                ans %= mod;
            }
            tmp = tmp * 26 % mod;
        }
        printf("Case #%d: %lld\n", ++T, ans);
    }
    return 0;
}

T10 循环节问题

#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std ;
typedef long long ll ;
 
ll n , k , t , ans ;
 
int main ( ) {
     int T = 0 ;
     while ( ~ scanf ( "%lld%lld" , &n , &k ) ) {
         if ( k <= n )
             ans = k ;
         else    {
             k -= n ;
             t = k / ( n - 1 ) ;
             k = k % ( n - 1 ) ;
             if ( k <= 0 )
                 k += ( n - 1 ) ;
             if ( t & 1 ) {
                 ans = k ;
             } else {
                 if ( k == ( n - 1 ) )
                     ans = n ;
                 else
                     ans = k ;
             }
         }
         printf ( "Case #%d: %lld\n" , ++ T , ans ) ;
     }
     return 0 ;
}

唯一的遗憾还是在T6上吧,毕竟相当于挂机2个小时,心里很难受,手足无措。还是太弱了吧,第一场多校只能说差强人意。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值