Codeforces Round #389 (Div. 2, Rated, Based on Technocup 2017 - Elimination Round 3) 圣诞之夜!

本文解析了三道圣诞主题的编程题目,包括桌子位置查询、键盘字符映射和机器人路径规划,提供了完整的代码实现和解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                           A. Santa Claus and a Place in a Class

   模拟题。(0:12)

题意:n列桌子,每列m张桌子,每张桌子一分为2,具体格式看题面描述。给出n,m及k。求编号为k的桌子在第几行第几列是左还是右。

   思路:由图知k为奇数在左边。每列有2*m个数,k/(2*m)然后就可以知道在第几列。然后数据小遍历找到第几行。

int main()
{
    int n,m,k;
    while(~scanf("%d%d%d",&n,&m,&k))
    {
        char c;
        if(k%2) c='L';
        else c='R';
        int x=0,y=0;
        y=k/(2*m);
        if(k%(2*m)) y++;
        k-=(y-1)*2*m;
        while(k>0)
        {
            k-=2;
            x++;
        }
         printf("%d %d %c\n",y,x,c);
    }
   return 0;
}



                                        B. Santa Claus and Keyboard Check

   贪心模拟题。(0:39)

    题意:真没读懂,大概知道了样例怎么来的。给出两个串,每个字符可以唯一对应(变成)另外一个字符,问如果第一个字符串可以变为另外一个串,输出对应要变的字符。

    思路:就是一顿乱判,用map存对应关系,可能是样例比较水吧,侥幸过了终判。

struct node
{
    char x,y;
}a1[N];
int main()
{
    string a,b;
    cin>>a>>b;
    if(a==b)
    {
        printf("0\n");
    }
    else
    {
        int f=0,len=0;
        int len1=a.size();
        int len2=b.size();
        if(len1!=len2) f=1;
        map<char,char>q;
        int v[50];
        memset(v,0,sizeof(v));
        memset(a1,'0',sizeof(a1));
        for(int i=0;i<len1&&i<len2;i++)
        {
            if(a[i]==b[i])
            {
                if(v[a[i]-'a']||v[b[i]-'a']) //已经有主了;
                {
                    if(v[a[i]-'a']&&q[a[i]]!=b[i]) f=1;
                    if(v[b[i]-'a']&&q[b[i]]!=a[i]) f=1;
                }
               else q[a[i]]=b[i];
            }
            else
            {
                if(v[a[i]-'a']||v[b[i]-'a'])
                {
                    if(v[a[i]-'a']&&q[a[i]]!=b[i]) f=1;
                 else if(v[b[i]-'a']&&q[b[i]]!=a[i]) f=1;
                }
                 else
                 {
                     q[a[i]]=b[i];
                     q[b[i]]=a[i];
                     a1[len].x=a[i];
                     a1[len++].y=b[i];
                 }
            }
            v[a[i]-'a']=1;
            v[b[i]-'a']=1;
        }
        if(f) printf("-1\n");
        else
        {
            printf("%d\n",len);
            for(int i=0;i<len;i++)
                printf("%c %c\n",a1[i].x,a1[i].y);
        }
    }
   return 0;
}


                                                C. Santa Claus and Robot

    侥幸过了终判,中间WA了一发。(1:41)

    题意:有一个串,只包含‘U’、‘L’、'R'、‘D’四种字符,分别表示往哪个方向走。小明要走一个序列,起点为p0,每次从pi走到pi+1(1<=i<n)。小明只会沿着格子走最短路。但路线可能有很多种。求n的最小值。

    思路:由最后一个图发现每次经过一个点都走了相反的路线。一去一回这这便经过了一个点。所以求有多少相反对即可。(U和D、L和R分别为一个相反对)

int main()
{
    int n;
    int v[50];
    memset(v,0,sizeof(v));
    string a;
    cin>>n>>a;
    int ans=0;
    char c=a[0];//当前状态,表示走的方向
    for(int i=0;i<n;i++)
    {
        if((c=='L'&&a[i]=='R')||(c=='R'&&a[i]=='L')||(c=='U'&&a[i]=='D')||(c=='D'&&a[i]=='U'))//遇到相反对
        {
            c=a[i];//更新当前状态
            ans++;
            memset(v,0,sizeof(v));
            v[a[i]-'A']=1;
            continue;
        }
        if(c=='L'||c=='R')
        {
            if((a[i]=='U'&&v['D'-'A'])||(a[i]=='D'&&v['U'-'A']))
            {
                c=a[i];
                ans++;
                memset(v,0,sizeof(v));
            }
              v[a[i]-'A']=1;
        }
        else
        {
            if((a[i]=='L'&&v['R'-'A'])||(a[i]=='R'&&v['L'-'A']))
            {
                c=a[i];
                ans++;
                memset(v,0,sizeof(v));
            }
            v[a[i]-'A']=1;
        }
    }
    ans++;//终点
    printf("%d\n",ans);
    return 0;
}
C题刚想到这个思路的时候学姐给了一个想法:每两个点之间只有两种方向。。。但按着这种思路WA在第六组了。。。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值