牛客小白月赛

 

B-显生之宙_牛客小白月赛89 (nowcoder.com)

题解:思路很简单,但是当时晕晕的,写拉了

题目要求最大,那么负数要让每一个数都加,正数只能加一个

我们正数加到最后一个数即可,负数累加

#include <bits/stdc++.h>
//#pragma GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
#define int long long
#define endl '\n'
using namespace std;
const int N=6e6+10,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
int kmp(int a,int k,int p)
{
    int ans=1;
    while (k)
    {
        if(k&1) ans=ans*a%p;
        k>>=1;
        a=a*a;
    }
    return ans;
}

int a[N];
void solve()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+1+n);
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        a[i]+=sum;
        if(a[i]<0)
        {
            sum+=a[i];

        }
        else if(i!=n)
        {
            a[n]+=a[i];
        }
    }
    cout<<a[n]<<endl;
}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

 C-太阳之华_牛客小白月赛89 (nowcoder.com)

赛时没有看,一个联通问题,其实想清楚就很简单

题解:我们可以推断出来,红方先那么只要红选择其中一个联通图就可以赢那我们打印红,负责就双方一直僵持成平局

而蓝方想赢那么就已开始就全部是蓝的,否则赢不了

由上我们可以清楚写法

首先我们先把全部的联通块标记出来,然后在每一个联通块向外扩张,把一个联通块可以扩张到的点记录在set里防止重复,然后只要有一个红方联通块可以跑完全部的蓝点那没红赢,否则平局

#include <bits/stdc++.h>
//#pragma GCC optimize("Ofast")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define double long double
#define int long long
#define endl '\n'
using namespace std;
const int N=2e3+10,M=1e1;
const int INF = 0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
int kmp(int a,int k,int p)
{
    int ans=1;
    while (k)
    {
        if(k&1) ans=ans*a%p;
        k>>=1;
        a=a*a;
    }
    return ans;
}
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
char a[N][N];
char an[N][N];
int n,m;
set<PII> s[N];
void dfs(int x,int y,int id)
{
    a[x][y]='*';
    an[x][y]=id;
    for(int i=0;i<4;i++)
    {
        int xx=x+dx[i];
        int yy=y+dy[i];
        if(xx<1 || xx>n || yy<1 || yy>m || a[xx][yy]!='#') continue;
        dfs(xx,yy,id);
    }
}


void solve()
{
    cin>>n>>m;
    int cntb=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            if(a[i][j]=='.') cntb++;
        }
    }

    if(cntb==n*m)
    {
        cout<<"Blue"<<endl;
        return;
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]=='#')
            {
                dfs(i,j,++ans);
            }
        }
    }
    for(int i=1;i<=ans;i++)
    {
        s[i].clear();
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]=='.')
            {
                for(int k=0;k<4;k++)
                {
                    int x=i+dx[k];
                    int y=j+dy[k];
                    if(x<1 || x>n || y<1 || y>m || a[x][y]!='*') continue;
                    s[an[x][y]].insert({i,j});
                }
            }
        }
    }
    for(int i=1;i<=ans;i++)
    {
        if(s[i].size()==cntb)
        {
            cout<<"Red"<<endl;
            return;
        }
    }
    cout<<"Draw"<<endl;
}
signed main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

 

posted @ 2024-03-24 15:53  whatdo+  阅读(15)  评论(0编辑  收藏  举报