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

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

原文地址:https://www.cnblogs.com/whatbeg/p/3728550.html