BestCoder Round #81 (div.2) A,B,C

40min补完了这三题。。
然后后面2道题,小茫然。等高数考完再补吧。。

Machine

想想就知道是三进制,但是题解的方法更简单,我弱弱的方法也过了。。

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string test;
int main()
{
    long long T;
    scanf("%I64d",&T);
    while(T--)
    {
        long long num,change;
        scanf("%I64d%I64d",&num,&change);
        test.clear();
        while(change)
        {
            if(change%3==0)
            {
                test=test+'0';
            }
            else if(change%3==1)
            {
                test=test+'1';
            }
            else
            {
                test=test+'2';
            }
            change=change/3;
        }
        long long len=test.size();
        //cout<<test<<endl;
        reverse(test.begin(),test.end());
        //cout<<test<<endl;
        len++;
        if(len>num)
        {
            len--;
            //cout<<test<<endl;
            for(long long i=len-num;i<len;i++)
            {
                if(test[i]=='0')
                {
                    printf("R");
                }
                else if(test[i]=='1')
                {
                    printf("G");
                }
                else
                {
                    printf("B");
                }
            }
        }
        else
        {
            len--;
            for(long long i=1;i<=num-len;i++)
            {
                printf("R");
            }
            for(long long i=0;i<len;i++)
            {
                if(test[i]=='0')
                {
                    printf("R");
                }
                else if(test[i]=='1')
                {
                    printf("G");
                }
                else
                {
                    printf("B");
                }
            }
        }
        printf("\n");
    }

    return 0;
}

B 简单的模拟。。
题解的方法似乎比我少开2个数组,膜拜。。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int MAXN=10010;
int whon[MAXN];
int whom[MAXN];
int way[MAXN][MAXN];
int flagn[MAXN];
int flagm[MAXN];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m,num;
        scanf("%d%d%d",&n,&m,&num);
        for(int i=1;i<=n;i++)
        {
            whon[i]=i;
        }
        for(int j=1;j<=m;j++)
        {
            whom[j]=j;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%d",&way[i][j]);
            }
        }
        memset(flagm,0,sizeof(flagm));
        memset(flagn,0,sizeof(flagn));
        int a,how,b;
        while(num--)
        {
            scanf("%d%d%d",&how,&a,&b);
            if(how==1)
            {
                int t=whon[a];
                whon[a]=whon[b];
                whon[b]=t;
            }
            else if(how==2)
            {
                int t=whom[a];
                whom[a]=whom[b];
                whom[b]=t;
            }
            else if(how==3)
            {
                flagn[whon[a]]=flagn[whon[a]]+b;
            }
            else if(how==4)
            {
                flagm[whom[a]]=flagm[whom[a]]+b;
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                printf("%d",way[whon[i]][whom[j]]+flagn[whon[i]]+flagm[whom[j]]);
                if(j==m)
                {
                    printf("\n");
                }
                else
                {
                    printf(" ");
                }
            }
        }
    }
    return 0;
}

C 前后2个指针走一下就好了,网上似乎把这东西叫做尺取法。。(为何有种还是模拟的感觉),数组开小居然是超时也是醉了。。于是一直在自己写的,和别人的,实质一样的,写法不一样的地方纠结。。。map慢好多,要880+ms。。但是一旦变成 减‘a’,就是200ms了。。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
const int maxn=1000100;
char a[maxn];
map<char,int>all;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int num;
        scanf("%s",a);
        scanf("%d",&num);
        int len=strlen(a);
        int left=0,right=0;
        long long ans=0;
        int t=0;
        all.clear();
        while(1)
        {
            while(t<num&&right<len)
            {
                if(!all[a[right]])
                {
                    t++;
                }
                all[a[right]]++;
                right++;
            }
            if(t<num)
                break;
            while(1)
            {
                ans=ans+(len-right+1);
                all[a[left]]--;
                left++;
                if(!all[a[left-1]])
                    break;
            }
            t--;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(bc)