2021年度训练联盟热身训练赛第一场(牛客) 解题/补题报告
https://ac.nowcoder.com/acm/contest/12606
D
你的朋友偷偷地选了N个连续的正数,从1到100的整数,让你猜它们的和是多少(偶数或奇数或不能确定)
思路:因数据范围<10,故我选择打表
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { int n; cin>>n; if(n==1){ cout<<"Either"<<endl; }else if(n==2){ cout<<"Odd"<<endl; }else if(n==3){ cout<<"Either"<<endl; }else if(n==4){ cout<<"Even"<<endl; }else if(n==5){ cout<<"Either"<<endl; }else if(n==6){ cout<<"Odd"<<endl; }else if(n==7){ cout<<"Either"<<endl; }else if(n==8){ cout<<"Even"<<endl; }else if(n==9){ cout<<"Either"<<endl; }else if(n==10){ cout<<"Odd"<<endl; } return 0; }
F
圣诞老人需要把每次旅行的动物分成两组,这样一组中所有动物的重量总和等于另一组中所有动物的重量总和。为了让这个过程更有效率,圣诞老人正在寻求一个整数目标体重t,这样,所有比t轻的动物归为一组,比t重的动物归为另一组。如果有多个这样的t,他想要最小的那个。有一个小问题:如果有些动物的重量正好等于t,我们该怎么办?圣诞老人是这样解决这个问题的:如果这类动物的数量是偶数,他就把它们平均分配给两组(这样就把重量平均分配了)。但是如果这类动物的数量是奇数,那么其中的一只动物就被派去和精灵们一起制作玩具(它不属于任何一组),剩下的动物(现在是偶数)平均分配给两组。
#include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<map> using namespace std; #define MAXN 100010 typedef long long ll; ll a[MAXN],sum[MAXN]; int main(){ int m; cin>>m; int ans=0; for(int i=0;i<m;i++){ cin>>a[i]; } sort(a,a+m); for(int i=0;i<m;i++){ sum[i]=sum[i-1]+a[i]; } int t; for(int i=0;i<m;i++){ if(sum[i]==sum[m-1]-sum[i]){ t=a[i]; if(a[i]==a[i+1]){ t=a[i]; }else{ t++; } break; } if(sum[i]==sum[m-1]-sum[i+1]){ t=a[i+1]; break; } } cout<<t<<endl; return 0; }
J
给定一个n × n的网格,每个方格都是黑色或白色。如果满足以下所有条件,则网格是正确的:每一行/列都有相同数量的黑色正方形和白色正方形。每一行或一列有3个或3个以上相同颜色的连续正方形。
给定一个网格,判断它是否正确。
思路:根据他说的循环判断就行
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { int n,i,j,flag=0,w,b,b1,w1; cin>>n; string s[50]; for(i=0;i<n;i++){ cin>>s[i]; } for(i=0;i<n;i++){ w=0,b=0,b1=0,w1=0; for(j=0;j<n;j++){ if(s[i][j]=='W'){ w++; b1=0; w1++; } if(s[i][j]=='B'){ b++; w1=0; b1++; } if(b1>=3 || w1>=3){ flag==1; break; } } if(b!=w){ flag=1; break; } } if(flag==1){ cout<<"0"<<endl; return 0; } flag=0; for(i=0;i<n;i++){ w=0,b=0,b1=0,w1=0; for(j=0;j<n;j++){ if(s[j][i]=='W'){ w++; b1=0; w1++; } if(s[j][i]=='B'){ b++; w1=0; b1++; } if(b1>=3 || w1>=3){ flag==1; break; } } if(b!=w){ flag=1; break; } } if(flag==1){ cout<<"0"<<endl; return 0; }else{ cout<<1<<endl; } return 0; }
H
思路:求出最短路径-1,(比赛的时候想到了QWQ没写出来)
(参考大佬代码QWQ)
#include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <queue> using namespace std; #define ll long long const int INF = 0x3f3f3f; const int maxn = 100005 * 2; int m,n; bool vis[maxn] = {0}; vector<int> vec[maxn]; int dis[maxn] = {0}; queue<ll> q; int main() { cin >> n >> m; int u,v; for(int i = 1; i <= m; ++i) { cin >> u >> v; vec[u].push_back(v); vec[v].push_back(u); } q.push(1); vis[1] = 1; while(!q.empty()) { int u = q.front(); q.pop(); for(int v:vec[u]) { if(vis[v]) continue; vis[v] = 1; dis[v] = dis[u] + 1; q.push(v); } } cout << dis[n]<< endl; return 0; }