农场主约翰的农场在最近的一场风暴中被洪水淹没,这一事实只因他的奶牛极度害怕水的消息而恶化。题目描述
然而,他的保险公司只会根据他农场最大的“湖”的大小来偿还他一笔钱。
农场表示为一个矩形网格,有N(1≤N≤100)行和M(1≤M≤100)列。网格中的每个格子要么是干的,
要么是被淹没的,而恰好有K(1≤K≤N×M)个格子是被淹没的。正如人们所期望的,一个“湖”有一个
中心格子,其他格子通过共享一条边(只有四个方向,对角线不算的意思)与之相连。任何与中央格子共享一条边或与中央格
子相连的格子共享一条边的格子都将成为湖的一部分。
输入描述:
第一行有三个整数N,M,K,分别表示这个矩形网格有N行,M列,K个被淹没的格子。
接下来K行,每一行有两个整数R,C。表示被淹没的格子在第R行,第C列。
输出描述:
输出最大的“湖”所包含的格子数目
示例1
输入
复制
3 4 5
3 2
2 2
3 1
2 3
1 1
输出
复制
4
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std ;
const int MAX = 1050 ;
typedef long long LL ;
int n ,m ,k ;
int ans = 0 ;
int vis[MAX][MAX] ;
int book[MAX][MAX] ;
int dx[4] = {0,1,0,-1} ;
int dy[4] = {1,0,-1,0} ;
struct node{
int x ;
int y ;
};
void dfs(int x , int y){
queue<node> q ;
q.push({x,y}) ;
while(!q.empty()){
node t = q.front() ;
q.pop() ;
for(int k = 0 ; k<4; k++ ) {
int tx = t.x + dx[k] ;
int ty = t.y + dy[k] ;
if(tx <1 || tx >n || ty<1 || ty>m){
continue ;
}
if(!book[tx][ty] &&vis[tx][ty]==1){
book[tx][ty] = 1 ;
ans++;
q.push({tx,ty}) ;
}
}
}
}
int main(){
cin >> n >> m >> k ;
for(int i = 1 ; i<=k ; i++ ) {
int x ,y ;
cin>>x >>y ;
vis[x][y] = 1 ;
}
int maxx = -1 ;
for(int i = 1 ; i<=n ; i++ ) {
for(int j = 1 ; j<=m ; j++ ) {
ans = 0 ;
if(vis[i][j]){
dfs(i,j) ;
maxx = max(ans,maxx) ;
}
}
}
cout<<maxx ;
return 0 ;
}
链接:https://ac.nowcoder.com/acm/contest/910/F 来源:牛客网
题目描述
给出T 个由O 和X 组成的字符串,统计所有字符的得分和。每个O 的得分为目前连续出现的O 的个数,X 的得分为0 。
输入描述:
第一行输入一个整数T,表示共有T组测试样例
接下来T行,每行输入一个字符串
输出描述:
每组样例输出一行,代表总得分
示例1
输入
复制
2
OOXXOXXOOO
OO
输出
复制
10
3
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
const int MAX = 10005 ;
char str[MAX] ;
int d[MAX] ;
int main(){
int n ;
cin >>n ;
while(n--){
cin >>str;
int len = strlen(str) ;
int num = 1 ;
int cnt = 0 ;
for(int i = 0 ; i<len ; i++ ) {
if(str[i]=='O'){
d[cnt++] = num++ ;
}
else{
num = 1 ;
}
}
for(int i = 1 ; i<cnt ; i++ ) {
d[i] = d[i] +d[i-1] ;
}
cout<<d[cnt-1] <<endl;
}
return 0 ;
}
链接:https://ac.nowcoder.com/acm/contest/910/G 来源:牛客网
题目描述
小C手中有n张牌,每张牌上有一个一位数的数,这个数字不是0就是5。
小C从这些牌在抽出任意张(不能抽0张),排成一行就组成了一个数。
使得这个数尽可能大,而且可以被90整除。
注意:
1.这个数没有前导0,
2.小C不需要使用所有的牌。
输入描述:
每个测试数据输入共2行。
第一行给出一个n,表示n张牌。(1<=n<=1000)
第二行给出n个整数a[0],a[1],a[2],…,a[n-1] (a[i]是0或5 ) 表示牌上的数字。
输出描述:
共一行,表示由所给牌组成的可以被90整除的最大的数,如果没有答案则输出”-1”(没有引号)
示例1
输入
复制
4
5 0 5 0
输出
复制
0
思路
保证最后一位为0,剩余位数数字和加起来为9的倍数。为保证尽量大且没有前导零,将5堆到前面,0堆到后面。
#include <iostream>
#include <cstdio>
using namespace std ;
const int MAX = 1005 ;
int main(){
int n ;
int num0 = 0 ;
int num5 = 0 ;
cin >> n ;
for(int i = 0 ; i<n ; i++ ) {
int x ;
cin >>x ;
if(x) {
num5 ++ ;
}
else{
num0++ ;
}
}
if(num0){
for(int i = 1 ; i<=num5/9 ; i++ ) {
for(int j = 1 ; j<=9 ; j++ ) {
cout<<5 ;
}
}
if(num5 /9 == 0 ){
cout<<0;
}
else
while(num0--){
cout<<0;
}
}
else{// 全是 5 一定不能被 90 整除
cout<<-1 ;
}
return 0 ;
}