Codeforces Round #551 (Div. 2) ABC题解

A. Serval and Bus

题目链接:

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

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=105;
ll gcd (ll a,ll b)
{
    return b==0? a:gcd(b,a%b);
}
int n,k;
int a[maxn],w[maxn];
int main()
{
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i],&w[i]);
    }
    int ans=0,ok=0;
    for (int i=1;i<=n;i++)
    {
        if(a[i]>k) continue;
        if((k-a[i])%w[i]==0)
        {
            ans=i;
            break;
        }
    }
    if(ans!=0) {
            printf("%d\n",ans);
            return 0;
    }
    for (int i=1;i<=n;i++)
    {
        while(a[i]<k)
        {
            a[i]+=w[i];
        }
    }
    int Min=0x3f3f3f3f,loc=-1;
    for (int i=1;i<=n;i++) {
            if(Min>a[i])
            {
                Min=a[i];
                loc=i;
            }
    }
    printf("%d\n",loc);
    return 0;
}

 B. Serval and Toy Bricks

题目链接:

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

俯视图为1的点只需要取左视图和主视图中较小的值即可

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=105;
ll gcd (ll a,ll b)
{
    return b==0? a:gcd(b,a%b);
}
int n,m,hh;
int a[maxn];
int b[maxn];
int h[maxn][maxn];
int ans[maxn][maxn];
int main()
{
    scanf("%d%d%d",&n,&m,&hh);
    for (int i=1;i<=m;i++) scanf("%d",&a[i]);
    for (int i=1;i<=n;i++) scanf("%d",&b[i]);
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=m;j++)
        {
            scanf("%d",&h[i][j]);
        }
    }
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=m;j++)
        {
            ans[i][j]=INF;
        }
    }
    for (int i=1;i<=m;i++)
    {
        for (int j=1;j<=n;j++)
        {
            if(h[j][i]==1) ans[j][i]=min(ans[j][i],a[i]);
        }
    }
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=m;j++)
        {
            if(h[i][j]==1) ans[i][j]=min(ans[i][j],b[i]);
        }
    }
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=m;j++)
        {
            if(h[i][j]==0) printf("0 ");
            else printf("%d ",ans[i][j]);
        }
        printf("\n");

    }
    return 0;
}

C. Serval and Parenthesis Sequence 

题目链接:

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

保证前后字符必须为'('和')',然后判断中间的字符串是否可以一一匹配。

代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=3*1e5+5;
ll gcd (ll a,ll b)
{
    return b==0? a:gcd(b,a%b);
}
int n;
char s[maxn];
int main()
{
    scanf("%d",&n);
    scanf("%s",s);
    if(n%2)
    {
        printf(":(\n");
        return 0;
    }
    if(s[0]==')')
    {
        printf(":(\n");
        return 0;
    }
    if(s[0]=='?') s[0]='(';
    if(s[n-1]=='(')
    {
        printf(":(\n");
        return 0;
    }
    if(s[n-1]=='?') s[n-1]=')';
    int numa,numb;
    numa=numb=(n-2)/2;
    for (int i=1;i<n-1;i++)
    {
        if(s[i]=='(') numa--;
        if(s[i]==')') numb--;
    }
    for (int i=1;i<n-1;i++)
    {
        if(s[i]=='?')
        {
            if(numa>0)
            {
                s[i]='(';
                numa--;
            }
            else
            {
                s[i]=')';
                numb--;
            }
        }
    }
    if(numa!=0||numb!=0)
    {
        printf(":(\n");
        return 0;
    }
    stack<char> st;
    for (int i=1;i<n-1;i++)
    {
        if(s[i]=='(')
        {
            st.push(s[i]);
        }
        else
        {
            if(st.empty())
            {
                printf(":(\n");
                return 0;
            }
            char t=st.top();
            if(t=='(') st.pop();
            else
            {
                printf(":(\n");
                return 0;
            }
        }
    }
    if(!st.empty())
    {
        printf(":(\n");
        return 0;
    }
    printf("%s\n",s);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41410799/article/details/89293488