Cf 363div2 A B C

A

题目链接

http://codeforces.com/contest/699/problem/A

题意

有些粒子向左飞,有些粒子向右飞,问最先碰到一起的粒子的时间。

题解

虽然是水题,但还是考虑漏了一些东西,WA了两发…只有RL这种情况才可以碰到,R遇到R要更新,L遇到R要更新。[自己蠢了,只需要寻找相邻的RL组合即可,比较取最小值]

代码

#include<bits/stdc++.h>
using namespace std;
int a[200005];

int main()

{
    int n;
    scanf("%d",&n);
    string st;
    cin>>st;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    int ans=1e9+9;
    int ok=0;
    char b=st[0];
    int op=0;

    for(int i=1;i<n;i++)
    {
        if(b=='R'&&st[i]=='L'){ok=1;int t=(a[i]-a[op])/2;ans=min(ans,t);b='0';}
        if(b=='0'&&st[i]=='R'){op=i;b='R';}
        if(b=='R'&&st[i]=='R'){op=i;}
        if(b=='L'&&st[i]=='R'){op=i;b='R';}
    }
    if(ok==0)printf("-1\n");
    else printf("%d\n",ans);
    return 0;

}

B

题目链接

http://codeforces.com/contest/699/problem/B

题意

是否存在一个点,可以把所有的墙全部爆掉,这个点可以是空的,也可以是有墙的。

题解

把墙所在的行与列单独分出来,然后遍历所有的点,寻找满足点所在行与列的墙数之和等于总的墙数的,需要注意如果所在点是墙的话,则是总的墙数减1。
对了还有个奇坑,连续两个scanf读入数据,如果第二个scanf读入char类型的话,会读入一个\n…[吃鲸]…mdzz 但是换成%s读入就没有问题。。

代码

#include<bits/stdc++.h>
using namespace std;
char c[1002][1002];
int main()
{
    int row[1005];
    int col[1005];
    int n,m;
    cin>>n>>m;
    memset(row,0,sizeof(row));
    memset(col,0,sizeof(col));
    int cnt=0;
   //fflush(stdin);
    char s[1005];
    for(int i=1;i<=n;i++)
    {   scanf("%s",s+1);
        for(int j=1;j<=m;j++)
        {
            c[i][j]=s[j];
            if(s[j]=='*')
            {   cnt++;
                row[i]++;
                col[j]++;
            }


        }
    }
    int ok=0,ans1,ans2;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(row[i]+col[j]==cnt&&c[i][j]=='.'){ok=1;ans1=i;ans2=j;break;}
            if(row[i]+col[j]==cnt+1&&c[i][j]=='*'){ok=1;ans1=i;ans2=j;break;}
        }
    }
    if(ok==1){printf("YES\n");printf("%d %d\n",ans1,ans2);}
    else printf("NO\n");
    return 0;
}

C

题目链接

http://codeforces.com/contest/699/problem/C

题意

程序猿要运动要码代码,要休息。但是他不会连续两天干同一件事,除了休息。问他最少可以休息几天。

题解

把3处理成1或2,然后根据连续的1或2,rest[休息时间]++,我们要尽可能地多干活,如果3的前一天是1那么3转换为2,是2转换为1,若是0,则要根据后面的一个非3且非0的天的情况决定,间隔奇数天则该天是2则3转换为1,1转换为2,偶数天则该天是2则3转换为2,同理1。注意单独处理第一天的是3的情况。注意咯,不能把3单独处理完全后再遍历连续两天的情况,因为连续两天的情况第二天是等同于0,这样会影响3的处理情况。。PS要仔细把所有情况考虑周全呀,有些特例也要处理完全才行。

代码

#include<bits/stdc++.h>
using namespace std;
typedef  struct qz{
    int jj;
    int write,gym;
};
int a[105];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        int t;
        scanf("%d",&t);
        a[i]=t;

    }
    int rest=0;
    if(a[0]==0)rest++;
    if(a[0]==3)
    {
        int j=1;
        while(a[j]==3||a[j]==0)
                {
                    j++;
                }
                if((j-0)%2==0)a[0]=a[j];
                else {if(a[j]==1)a[0]=2;
                        else a[0]=1;}
    }


    for(int i=1;i<n;i++)
    {

        if(a[i]==3)
        {
            if(a[i-1]==1)a[i]=2;
            else if(a[i-1]==2)a[i]=1;
            else if(a[i-1]==0)
            {
                int j=i+1;
                while(a[j]==3||a[j]==0)
                {
                    j++;
                }
                if((j-i)%2==0)a[i]=a[j];
                else {if(a[j]==1)a[i]=2;
                        else a[i]=1;
                }
            }
        }
        if(a[i]==0)rest++;
       else if(a[i]==a[i-1]){a[i]=0;rest++;}
    }




    printf("%d\n",rest);
    return 0;
}

在附另外一份代码,QAQ好强

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int num[105];

int main()
{
    int n, ans = 0;
    cin>>n;
    for(int i = 1;i <= n;i ++)
    {
        scanf("%d", &num[i]);
        if(num[i] == 0)
            ans++;
    }
    for(int i = 1;i <= n;i ++)
    {
        if(num[i] == 1 && num[i+1] == 1)
        {
            ans++;
            num[i+1] = 0;
        }
        else if(num[i] == 2 && num[i+1] == 2)
        {
            ans++;
            num[i+1] = 0;
        }
        else if(num[i] == 2 && num[i+1] == 3)
        {
            num[i+1] = 1;
        }
        else if(num[i] == 1 && num[i+1] == 3)
        {
            num[i+1] = 2;
        }
    }
    cout<<ans<<endl;
    return 0;
}
<div id="wea_rich_text_default_font" style="font-family:微软雅黑;font-size:12;"><p><img alt="" src="/weaver/weaver.file.FileDownload?fileid=aaa9aee4717d33272bd7ea028fa03118b693919f23b18febf9f6cee1158e8f4cf027542c71c8cf98d63770ccdf3bd1750e6b92e28c43dccd4" /></p><div class="ckeditor-html5-video" data-widget="html5video" style="text-align:left"><video controls="controls" src="/weaver/weaver.file.FileDownload?fileid=aad6f413f83191673980c5ee24b412880d6b9e8703caca411faec3276fe8133f5fa7e34630ca89ace63770ccdf3bd175071362141037cfb4e&download=1" style="max-width:100%"> </video></div><table border="1" cellpadding="1" style="width:500px;"> <tbody> <tr> <td style="padding: 1px;">1</td> <td style="padding: 1px;">1</td> </tr> <tr> <td style="padding: 1px;">2</td> <td style="padding: 1px;">2</td> </tr> <tr> <td style="padding: 1px;">3</td> <td style="padding: 1px;">3<a href="http://localhost:8080/wui/index.html#/main/portal/portal-1-1?menuIds=0,1&menuPathIds=0,1&_key=zq8830" target="_blank">http://localhost:8080/wui/index.html#/main/portal/portal-1-1?menuIds=0,1&menuPathIds=0,1&_key=zq8830</a></td> </tr> </tbody></table><p>测试<a href="http://localhost:8080/wui/index.html#/main/portal/portal-1-1?menuIds=0,1&menuPathIds=0,1&_key=zq8830" target="_blank">http://localhost:8080/wui/index.html#/main/portal/portal-1-1?menuIds=0,1&menuPathIds=0,1&_key=zq8830</a></p><p> </p><p>修改一下吧 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq<img alt="" src="/weaver/weaver.file.FileDownload?fileid=a7617945ec5f52ec80aaa43ee8504de0a1b14d5eca4a98834494c85349762c626dec7ba8d0da277106ee600d27743f4e44f710fbddd167603" /></p></div>
最新发布
06-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值