牛客小白月赛
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; }