Codeforces Round #608 (Div. 2)

A题:https://codeforces.com/contest/1271/problem/A

题意:这道题的话,就是给你一套衣服的四个部件,a,d部件可以组成一套衣服,b,c,d部件也可以组成一套衣服,花费分别是e和f。问你最多需要多少花费能做完衣服。

思路:思路的话就是分成两种情况讨论,比较简单。

AC代码:

#include <bits/stdc++.h>
typedef long long ll;
const int maxx=10010;
const int inf=0x3f3f3f3f;
using namespace std;
int main()
{
    int a,b,c,d,e,f;
    cin>>a>>b>>c>>d>>e>>f;
    int cnt=0;
    if(e>f)
        cnt=min(a,d)*e+min(min(b,c),d-min(a,d))*f;
    else
        cnt=min(min(b,c),d)*f+min(a,d-min(min(b,c),d))*e;
    cout<<cnt<<endl;
    return 0;
}

B题:https://codeforces.com/contest/1271/problem/B

题意:这道题的话,给你一串字符串,有n个字符,其中只有W和B,W代表白色,B代表黑色。问你能不能再3n的步骤里把它们全变成白色或者黑色。

思路:思路的话,就是分情况讨论,已知如果要是n为奇数的话,肯定是不能成功的,另一种情况暴力一下即可。

AC代码:

#include <bits/stdc++.h>
typedef long long ll;
const int maxx=10010;
const int inf=0x3f3f3f3f;
using namespace std;
char a[maxx];
int b[maxx],c[maxx];
int i,n,j,s1,s2;
int main()
{
    cin>>n;
    getchar();
    for(i=0; i<n; i++)
    {
        cin>>a[i];
        if(a[i]=='B')
        {
            b[i]=0;
            s1++;
        }
        else
        {
            b[i]=1;
            s2++;
        }
    }
    if(s1%2 && s2%2)
    {
        cout<<"-1"<<endl;
        return 0;
    }
    for(i=0; i<n-1; i++)
    {
        if(b[i]==0)
        {
            b[i]=1-b[i];
            b[i+1]=1-b[i+1];
            c[j++]=i+1;
        }
    }
    if(b[n-1]!=1)
        for(i=0; i<n-1; i=i+2)
            c[j++]=i+1;
    cout<<j<<endl;
    for(i=0; i<j; i++)
        cout<<c[i]<<" ";
    cout<<endl;
    return 0;
}

C题:https://codeforces.com/contest/1271/problem/C

题意:给出一个点(sx,sy),再给出n个点(xi,yi)。现在找到一个点(x0,y0),使得cnt最大。每当有一个点(xi,yi)到点(sx,sy)的最短曼哈顿距离经过(x0,y0)时,cnt++。最后输出cnt和(x0,y0)。
思路:显然,所有最短曼哈顿路径必然存在于一个矩形之内。那么我们直接将所有以(sx,sy),(xi,yi)为顶点的矩形画出来即可发现最优位置只可能存在于(sx,sy)的四个方向上。所以直接统计在哪个方向上最优即可。

AC代码:

#include <bits/stdc++.h>
typedef long long ll;
const int maxx=10010;
const int inf=0x3f3f3f3f;
using namespace std;
int n,sx,sy;
int d[4];
void run()
{
    for(int i=1; i<=n; i++)
    {
        int x,y;
        cin>>x>>y;
        if(x>sx)
            ++d[0];
        else if(x<sx)
            ++d[1];
        if(y>sy)
            ++d[2];
        else if(y<sy)
            ++d[3];
    }
    int mx=*max_element(d,d+4);
    cout<<mx<<endl;
    if(d[0]==mx)
    {
        cout<<sx+1<<" "<<sy<<endl;
    }
    else if(d[1]==mx)
    {
        cout<<sx-1<<" "<<sy<<endl;
    }
    else if(d[2]==mx)
    {
        cout<<sx<<" "<<sy+1<<endl;
    }
    else
    {
        cout<<sx<<" "<<sy-1<<endl;
    }
}
int main()
{
    while(cin>>n>>sx>>sy)
        run();
    return 0;
}
发布了204 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43846139/article/details/103954854
今日推荐