• 快乐组队赛XD(2017 Chinese Multi-University Training, BeihangU Contest)


    组队赛(❌)

    单人solo赛(✓)

    人整麻了,队友失踪,暑假没锻炼搬个行李拉伤了,留下了手残and全队最不会打代码的人独自美丽(否),导致每题都wa了几发(哭)

    顺带吐槽前队长选的啥古早题目啊

    开学了要好好打代码了呜呜

    笑死,在志愿顺序不变的情况下,大二是第三志愿,大三是第二志愿,年纪和志愿成反比

    来个链接Dashboard - 2017 Chinese Multi-University Training, BeihangU Contest - Codeforces

    A.Add More Zero:按照惯例,先看样例,好,打表题(划)找规律。

    题意给m,求10^k<2^m时k的最大整数值

    令10^k=2^m,取对数,k=m*log10(2),c++自带log10函数,结束

    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include 
    #include        
    #include
    using namespace std;

    int main()
    {
        int n=0,pos=0;
        while(scanf("%d",&n)!=EOF)
        {
            pos++;
            int ans;
            ans=n*log10(2);
            printf("Case #%d: %d\n",pos,ans);
        }
        return 0;
    }

    B.Balala Power!:巴啦啦能量!(拖走)

    题意:给定n个小写字符串,给a-z的26个字母赋值0-25的任意值,求字符串和(26进制)的最大值(十进制)取模,且字符串不含前导零。

    感觉是小学奥数题的给个竖式求每个字的值(否)

    以abc为例,我们曾经学过n进制转十进制,求得十进制式子为26^2*a+26^1*b+26^0*c,由此可以得到题目所需要式子,顺带可以求出每个字母的贡献度取模。

    第二步,我们要标记哪些字母不能为0,即字符串长度不为1的首位做个标记

    第三步,定数字的值,虽然前面求了贡献度,按理来说可以直接贡献度排序,但现实总是悲惨的,贡献度数字太大被取模了无法比较,这时候我们令每个字母都为1,用数组通过十进制的形式存储式子,即第i个字母的贡献度为26^j*a[i][j],并且处理进位

    接下来就是对比贡献度,贡献度从小到大排序,从1-25赋值,注意0的赋值需要用到第二步的标记。

    第四部,算出结果

    好耶

    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include 
    #include        
    #include
    using namespace std;
    const int N=1e5+5;
    const int mod=1e9+7;
    int L;
    int a[26][N],powe[N],sum[26];
    bool flag[26];
    char str[N];
    int b[26];
    bool cmp(int A , int B)
    {
        for (int i = L - 1 ; i >= 0 ; -- i)
        {
            if (a[A][i] != a[B][i])
            {
                return a[A][i] < a[B][i];
            }
        }
        return 0;
    }//贡献度排序
    int main()
    {
        int n=0,pos=0;
        int m;
        powe[0]=1;
        for(int i=1;i     {
            powe[i]=(long long)powe[i - 1] * 26 % mod;
        }
        while(scanf("%d",&n)!=EOF)
        {
            L=0;
            memset(a , 0 , sizeof(a));
            memset(flag , 0 , sizeof(flag));
            memset(sum , 0 , sizeof(sum));
            pos++;
            while(n--)
            {
                scanf("%s",str);
                int len = strlen(str);
                if (len > 1){
                flag[str[0] - 'a'] = 1;}//标记前导0
                reverse(str , str + len);//反转
                for(int i=0;i             {
                    a[str[i]-'a'][i]++;//贡献度十进制
                    sum[str[i] - 'a'] += powe[i];//贡献度的和
                    if (sum[str[i] - 'a'] >= mod)
                    {
                        sum[str[i] - 'a'] -= mod;
                        }
                }
                L=max(L,len);
            }
            for(int i=0;i<=25;i++)
            {
                for(int j=0;j             {
                    if(a[i][j]>=26)
                    {
                        a[i][j+1]+=(a[i][j]/26);
                        a[i][j]%=26;
                        
                    }
                }//进位
                while (a[i][L])
                {
                    a[i][L + 1] += a[i][L] / 26;
                    a[i][L ++] %= 26;
                }
                b[i]=i;
            }
            sort(b,b+26,cmp);
            int zero = -1;
            for (int i = 0 ; i < 26 ; ++ i)
                {
                if (!flag[b[i]])
            {
                zero = b[i];
                break;
            }
        }//前导0
        int res = 0 , x = 25;
        for (int i = 25 ; i >= 0 ; -- i)
        {
            if (b[i] != zero)
            {
                res += (long long)(x --) * sum[b[i]] % mod;
                res %= mod;
            }
        }//赋值求和

        printf("Case #%d: %d\n" ,pos , res);
            
            
        }
        return 0;
    }
     

    F.Function:累了不bb了

    给0-n-1的排序a和0-m-1的排序b,求映射f的种类,使得fi=bfai

    带入样例1

    f0=bf1,f1=bf0,f2=bf2

    因此a有两个循环,0到1到0,2到2

    b有两个循环,0到0,1到1

    如果b的循环长度为a的循环长度的因数,就可以带入,种类数为b的循环长度。

    合法的方案数相乘,即得

    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include 
    #include        
    #include
    using namespace std;
    const int N=1e5+5;
    const int mod=1e9+7;
    int n,m;
    int a[N],b[N]; 
    bool vis[N];
    vector q1,q2;
    int main()
    {
        int pos=1;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=0;i         scanf("%d",&a[i]);
            for(int i=0;i         scanf("%d",&b[i]);
            for(int i = 0; i < n; ++i){
                int pos = i;
                int cnt = 1;
                if(vis[i]) continue;
                while(a[pos] != i){
                    pos=a[pos];
                    vis[pos] = true;
                    ++cnt;
                }
                q1.push_back(cnt);
            }memset(vis,false,sizeof(vis));
            for(int i = 0; i < m; ++i){
                int pos = i;
                int cnt = 1;
                if(vis[i]) continue;
                while(b[pos] != i){
                    pos =b[pos];
                    vis[pos] = true;
                    ++cnt;
                }q2.push_back(cnt);
            }memset(vis,false,sizeof(vis));
            int ans = 1;
            int l1 = q1.size();
            int l2 = q2.size();
            for(int i = 0; i < l1; ++i){
                int res = 0;
                for(int j = 0; j < l2; ++j)
                    if(q1[i] % q2[j] == 0)
                        res = (res + q2[j]) % mod;
                ans = ans * res % mod;
            }
            q1.clear();
            q2.clear();
            printf("Case #%d: %d\n",pos++,ans);
        }
        return 0;
    }

    H. Hints of sd0061:

    大致题意:生成n个数字(生成规则如题)和m个询问,求数字串中第bi大的数字

    直接排序会超时,所以无法做离线查询,因此考虑利用快速排序的,因为快速排序本质上来说就是把序列分为大于基准数和小于基准数的两部分

    K. KazaQ's Socks:大致题意:有个b不爱洗袜子,他有n双袜子,编号1-n,他每天白天挑出干净袜子中id最小的穿,晚上脱掉了,如果脏袜子到了n-1双袜子,就丢去洗,第二天晚上才会干。求第bi天穿的哪双袜子

    好了,这回真的是打表出奇迹,找规律了

    三双袜子 123 12 13 12 13

    七双袜子 1234567 123456 123457 123456 123457……

    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include  
    #include 
    #include        
    #include
    using namespace std;

    int main()
    {
        long long n=0,pos=0;
        long long m;
        while(scanf("%lld %lld",&n,&m)!=EOF)
        {
            pos++;
            long long ans=0;
            if(m<=n)
            ans=m;
            else
            {
                long long k=(m-n)%(n-1);
                if(k!=0) ans=k;
                else 
                {
                    k=((m-n)/(n-1))%2;
                    ans=n-k;
                }
            }
        printf("Case #%lld: %lld\n",pos,ans);
        }
        return 0;
    }
     

    结束,有空再补

  • 相关阅读:
    三大数据库 sequence 之华山论剑 (下篇)
    公开可用的API 合集
    板对板连接器选型
    js对象的声明及使用
    Modularized Interaction Network for Named Entity Recognition
    2023年Vue开发中的8个最佳工具
    医药资讯网都有哪些?最值得推荐的有哪些?
    基于testng的自动化测试框架,自动化集成测试框架,自动本地集成测试框架,自动化单测框架
    HNUCM—第14届蓝桥杯CC++组选拔赛
    Spark SQL操作数据源
  • 原文地址:https://blog.csdn.net/yeah17981/article/details/126577977