• 2014 UESTC 暑前集训队内赛(2) 部分解题报告


    B.Cuckoo for Hashing

    模拟题。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <string>
    #include <vector>
    using namespace std;
    #define N 50007
    
    int a[1004],b[1004];
    
    int main()
    {
        int n1,n2,m,i;
        int x,fx,tx;
        int tmp,tmp2;
        int cs = 1;
        while(scanf("%d%d%d",&n1,&n2,&m)!=EOF && (n1||n2||m))
        {
            memset(a,-1,sizeof(a));
            memset(b,-1,sizeof(b));
            while(m--)
            {
                scanf("%d",&x);
                fx = x%n1;
                tx = 1003;
                if(a[fx] == -1)
                {
                    a[fx] = x;
                    continue;
                }
                tmp2 = x;
                while(a[fx] != -1)
                {
                    tmp = a[fx];
                    a[fx] = tmp2;
                    tx = tmp%n2;
                    if(b[tx] != -1)
                    {
                        tmp2 = b[tx];
                        b[tx] = tmp;
                        fx = tmp2%n1;
                    }
                    else
                    {
                        b[tx] = tmp;
                        break;
                    }
                }
                if(a[fx] == -1)
                    a[fx] = tmp2;
            }
            printf("Case %d:
    ",cs++);
            int flag = 0;
            //printf("Table 1
    ");
            for(i=0;i<n1;i++)
            {
                if(a[i] != -1)
                {
                    flag = 1;
                    break;
                }
            }
            if(flag)
            {
                printf("Table 1
    ");
                for(i=0;i<n1;i++)
                {
                    if(a[i] != -1)
                        printf("%d:%d
    ",i,a[i]);
                }
            }
            flag = 0;
            for(i=0;i<n2;i++)
            {
                if(b[i] != -1)
                {
                    flag = 1;
                    break;
                }
            }
            if(flag)
            {
                printf("Table 2
    ");
                for(i=0;i<n2;i++)
                {
                    if(b[i] != -1)
                        printf("%d:%d
    ",i,b[i]);
                }
            }
        }
        return 0;
    }
    View Code

    C.Playing Fair with Cryptography

    模拟题,注意细节就好。遇到J的情况要及时跳走。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <string>
    using namespace std;
    #define N 50007
    
    char mp[7][7];
    char key[100003],text[100004];
    int vis[28];
    
    string RUN(string ss)
    {
        int i,j;
        int a,b;
        int c,d;
        string ans = "";
        for(i=0;i<5;i++)
        {
            for(j=0;j<5;j++)
            {
                if(mp[i][j] == ss[0])
                    a = i,b = j;
                if(mp[i][j] == ss[1])
                    c = i,d = j;
            }
        }
        if(a == c)
        {
            int newb = (b+1)%5;
            ans += mp[a][newb];
            int newd = (d+1)%5;
            ans += mp[a][newd];
            return ans;
        }
        else if(b == d)
        {
            int newa = (a+1)%5;
            ans += mp[newa][b];
            int newc = (c+1)%5;
            ans += mp[newc][b];
            return ans;
        }
        else
        {
            int newb = d;
            int newd = b;
            ans += mp[a][newb];
            ans += mp[c][newd];
            return ans;
        }
    }
    
    int main()
    {
        int t,i,cs = 1,j,k;
        int x,y;
        scanf("%d",&t);
        getchar();
        while(t--)
        {
            gets(key);
            gets(text);
            int len1 = strlen(text);
            int len2 = strlen(key);
            memset(vis,0,sizeof(vis));
            k = 0;
            for(i=0;i<len2;i++)
            {
                char ch = key[i];
                if((ch >= 'A' && ch <= 'Z'))
                {
                    if(vis[ch-'A'])
                        continue;
                    vis[ch-'A'] = 1;
                    mp[k/5][k%5] = ch;
                    k++;
                }
                else if(ch >= 'a' && ch <= 'z')
                {
                    ch -= 32;
                    if(vis[ch-'A'])
                        continue;
                    vis[ch-'A'] = 1;
                    mp[k/5][k%5] = ch;
                    k++;
                }
            }
            for(char chh = 'A';chh<='Z';chh++)
            {
                if(chh == 'J')
                    continue;
                if(!vis[chh-'A'])
                {
                    mp[k/5][k%5] = chh;
                    k++;
                }
            }
            //alpha table established
            char ss[100004];
            k = 0;
            for(i=0;i<len1;i++)
            {
                if(text[i] >= 'A' && text[i] <='Z')
                    ss[k++] = text[i];
                else if(text[i] >= 'a' && text[i] <= 'z')
                    ss[k++] = text[i]-32;
            }
            ss[k] = '';
            printf("Case %d: ",cs++);
            int nowch = 0;
            char nowchar;
            string cy = "";
            for(i=0;i<k-1;i+=2)
            {
                if(nowch == 9)
                    nowch++,nowch%=26;
                if(ss[i] == ss[i+1])
                {
                    if(ss[i] == (nowch%26) + 'A')
                    {
                        nowchar = (++nowch)%26 + 'A';
                        if(nowchar == 'J')
                            nowch++,nowchar = 'K';
                    }
                    nowchar = (nowch%26) + 'A';
                    if(nowchar == 'J')
                            nowch++,nowchar = 'K';
                    cy = "";
                    cy += ss[i];
                    cy += nowchar;
                    cout<<RUN(cy);
                    nowch = (nowch+1)%26;
                    i -= 1;
                }
                else
                {
                    cy = "";
                    cy += ss[i];
                    cy += ss[i+1];
                    cout<<RUN(cy);
                }
            }
            if(i == k-1)
            {
                nowchar = nowch%26 + 'A';
                if(ss[i] == nowchar)
                {
                    nowchar = (++nowch)%26 + 'A';
                }
                if(nowchar == 'J')
                    nowch++,nowchar = 'K';
                cy = "";
                cy += ss[i];
                cy += nowchar;
                cout<<RUN(cy);
            }
            cout<<endl;
        }
        return 0;
    }
    View Code

    H.The Urge to Merge

    DP。借鉴标程代码。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <string>
    #define Mod 1000000007
    using namespace std;
    #define N 50007
    
    int mp[3][1003];
    ll dp[8][1004];
    
    ll Max(ll a,ll b,ll c,ll d)
    {
        return max(max(max(a,b),c),d);
    }
    
    int main()
    {
        int cs = 1,n;
        int i,j,k;
        while(scanf("%d",&n)!=EOF && n)
        {
            for(i=0;i<3;i++)
                for(j=1;j<=n;j++)
                    scanf("%d",&mp[i][j]);
            //memset(dp,0,sizeof(dp));
            for(i=0;i<7;i++)
                dp[i][0] = dp[i][1] = 0;
            dp[4][1] = mp[0][1]*mp[1][1];
            dp[6][1] = mp[1][1]*mp[2][1];
            ll k1 = Max(dp[4][1],dp[6][1],0,0);
            ll k2 = 0;
            ll s1,s2,s3,s4,s5;
    
            for(j=2;j<=n;j++)
            {
                s1 = mp[0][j-1]*mp[0][j];
                s2 = mp[1][j-1]*mp[1][j];
                s3 = mp[2][j-1]*mp[2][j];
                s4 = mp[0][j]*mp[1][j];
                s5 = mp[1][j]*mp[2][j];
    
                dp[1][j] = Max(k2,dp[2][j-1],dp[3][j-1],dp[6][j-1])+s1;  //第一种组合
                dp[2][j] = Max(k2,dp[1][j-1],dp[3][j-1],dp[5][j-1])+s2;  //第二种组合
                dp[3][j] = Max(k2,dp[1][j-1],dp[2][j-1],dp[4][j-1])+s3;  //第三种组合
    
                dp[4][j] = Max(k2+s1+s2,dp[3][j-1]+s1+s2,k1+s4,0);
                dp[5][j] = Max(k2,dp[2][j-1],0,0)+s1+s3;
                dp[6][j] = Max(k2+s2+s3,dp[1][j-1]+s2+s3,k1+s5,0);
                dp[0][j] = Max(k2+s1+s2+s3,dp[1][j]+s5,dp[3][j]+s4,0);
                k2 = k1;
                for(i=0;i<7;i++)
                    k1 = max(k1,dp[i][j]);
            }
            ll ans = -Mod;
            for(i=0;i<7;i++)
                ans = max(ans,dp[i][n]);
            printf("Case %d: %d
    ",cs++,ans);
        }
        return 0;
    }
    View Code

    (没做出来的以后持续更新)

  • 相关阅读:
    解决IDEA springBoot读取*.properties文件中文内容乱码的问题
    springboot读取自定义properties配置文件方法
    解决Vue调用springboot接口403跨域问题
    eclipse springboot工程打war包方法及在Tomcat中运行的方法
    Android native进程间通信实例-socket本地通信篇之——服务端进程异常退出解决办法
    Android native进程间通信实例-socket本地通信篇之——基本通信功能
    Android native进程间通信实例-binder篇之——解决实际问题inputreader内建类清楚缓存
    Android native进程间通信实例-binder篇之——用parcel传输数组
    Android native进程间通信实例-binder篇之——简单的单工通信
    解决多类开机弹框问题
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3728550.html
Copyright © 2020-2023  润新知