Codeforces Educational Codeforces Round 45 A-D

A:

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

让 n 是 m 的整数倍,  的最小 花费 是多少

#include <bits/stdc++.h>
typedef long long ll;

const int MAXN = 1e5+10;

using namespace std;

int main()
{

    ll n,m,a,b;
    cin>>n>>m>>a>>b;
    if(n%m==0)
    {
        cout<<0<<endl;
    }
    else
    {
        cout<<min(a*(m-n%m),b*(n%m))<<endl;
    }
    return 0;
}

B

大鱼吃小鱼,  

问最后剩下几只大鱼

标记所有没有被吃掉的鱼,最后加上个数

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

#include<bits/stdc++.h>

typedef long long ll;
const int MAXN = 2e5+ 10;

using  namespace std;

ll a[MAXN],b[MAXN];
map<ll,int>mp;
int cmp(int a,int b)
{
    return a>b;
}
int vis[MAXN];
int main()
{
    ll n,k;
    cin>>n>>k;
    for(int i = 1 ;i<=n;i++)
    {
        cin>>a[i];
        b[i]= a[i];
        mp[a[i]]++;
    }
    sort(a+1,a+n+1);
    int len = unique(a+1,a+1+n)-(a+1);
    if(len==1)
    {
        cout<<n<<endl;
        return 0;
    }

   // cout<<a[len]<<" "<<mp[a[len]]<<endl;
    ll ans = mp[a[len]];
    for(int i = 1; i<=len;i++)
    {
        if( a[i] < a[i+1] && a[i]+k < a[i+1])
        {
            vis[i] = 1;
        }
    }
    for(int i= 1;i<=n;i++)
    {
        if(vis[i])
            ans+=mp[a[i]];
    }
    cout<<ans<<endl;
    return 0;
}

C:

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

左括号匹配右括号, 或者一个完整的括号区匹配完整的括号 , 问有多少种

先预处理所有的括号, "(" ++ , ") "--;   小于0 不考虑

>=0 起来,

然后 将字符串逆转后 所有的括号 取反 "("->")"   ,")" -> "("; 

在处理 所有的括号,


最后取结果.

#include <bits/stdc++.h>
typedef long long ll;
const int MAXN = 3e5 +10;
#define fastIO ios_base::sync_with_stdio(0);
using namespace std;

int n;
string str[MAXN+10];
ll b[3][MAXN+10];
void init(int x)
{
    for(int i = 1;i<=n;i++)
    {
        int len =str[i].size();
        int c = 0;
        int flag = 1;
        for(int j = 0 ; j<len ;j++)
        {
            if(str[i][j]=='(') c++;
            else
                c--;
            if(c<0)
            {
                flag =0 ;
                break;
            }
        }
        if(flag)
        {
            b[x][c] ++;
        }
    }
}
int main()
{


    cin>>n;
    memset(b,0,sizeof(b));
    for(int i = 1 ;i <=n ;i++)
    {
        cin>>str[i];
    }
    init(1);
    for(int i = 1 ;i <=n ;i++)
    {
        reverse(str[i].begin(),str[i].end());
    }
    ll ans = 0;
    for(int i = 1; i<=n;i++)
    {
        int len = str[i].size();
        for(int j = 0; j<len ;j++)
        {
            if(str[i][j]=='(')
                str[i][j]=')';
            else
                str[i][j]='(';
        }
    }
    init(0);
    for(int i = 0 ;i< MAXN;i++)
        ans += b[1][i]*b[0][i];
    cout<<ans<<endl;
    return 0;
}

D:

http://codeforces.com/contest/990/problem/D

图的构造

边长为 n  图的联通块 为a ,  补图的联通块为 b. 

a 和b  其中必有一个 1, 否则 NO

当 n ==2  或者 n ==3  时   a =1 ,b= 1 为 NO

其余为YES

#include <bits/stdc++.h>
typedef long long ll;
const int MAXN = 3e5 +10;
#define fastIO ios_base::sync_with_stdio(0);
using namespace std;

int mp[1200][1200];

int main()
{
    int n,a,b;

    cin>>n>>a>>b;
    if(a != 1 && b!= 1)
    {
        cout<<"NO"<<endl;
        return 0;
    }
    if( (n==2|| n==3)&&(a==1&&b==1) )
    {
        cout<<"NO"<<endl;
        return 0;
    }
    memset(mp,0,sizeof(mp));
    cout<<"YES"<<endl;
    if( a==1 && b==1 )
    {
        for(int i = 1; i <=n-1;i++)
            mp[i][i+1] = mp[i+1][i] = 1;
    }
    else
    {
        int x = max(a,b);
        for(int i= 1 ;i <= (n-x);i++)
        {
            mp[i][i+1]= mp[i+1][i] = 1;
        }
        if(b==x)
        {
            for(int i = 1; i <=n;i++)
            {
                for(int j = 1; j<=n;j++)
                {
                    if(i==j) continue;
                    if( mp[i][j] ==1)
                        mp[i][j] = 0;
                    else
                        mp[i][j] =1;
                }
            }
        }
    }
    for(int i = 1; i<=n;i++)
    {
        for(int j = 1; j <= n; j++)
        {
            cout<<mp[i][j];
        }
        cout<<endl;
    }
    return 0;
}

1


猜你喜欢

转载自blog.csdn.net/sizaif/article/details/80657434