您的位置:首页 > 其它

国庆开始只切了几道水题,想了想还是记录一下吧

2015-10-03 15:13 295 查看

最大岛屿

时间限制:1000 ms  |  内存限制:65535 KB

描述
神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等。加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王。  这是一个由海洋、岛屿和海盗组成的危险世界。面对危险重重的海洋与诡谲的对手,如何凭借智慧与运气,建立起一个强大的海盗帝国。
杰克船长手头有一张整个海域的海图,上面密密麻麻分布着各个海屿的位置及面积。他想尽快知道整个海域共有多少岛屿以及最大岛屿的面积。
输入第1行:M N T,表示海域的长,宽及一个单位表示的面积大小

接下来有M行 ,每行有N个01组成的序列以及其中穿插一些空格。0表示海水,1表示陆地,其中的空格没用,可以忽略掉。

输出输出一行,有2个整数,一个空格间隔,表示整个海域的岛屿数,以及最大岛屿的面积样例输入
8 16 99


00000000 00000000


0000110011000000


0001111000111000


0000000  00 0000000


00111  111000001  10


001110000  0000000


0100001111 111100


0000000000000000

样例输出
5 990

提示①若一个陆地八个方向之一(上、下、左、右、左上、右上、左下、右下)的位置也是陆地,则视为同一个岛屿。

② 假设第一行,最后一行,第一列,最后一列全为0.

③ 1<M, N≤500 1<T≤100000

注意空格的处理

ac代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define MAXN 550
#define MAX(a,b) a>b?a:b
using namespace std;
int n,m,sum;
int dir[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int map[MAXN][MAXN];
int v[MAXN][MAXN];
int check(int xx,int yy)
{
if(map[xx][yy]==0||xx<0||xx>=n||yy<0||yy>=m)
return 0;
if(v[xx][yy])
return 0;
return 1;
}
void dfs(int x,int y)
{
if(check(x,y))
{
sum++;
v[x][y]=1;
for(int i=0;i<8;i++)
{
dfs(x+dir[i][0],y+dir[i][1]);
}
}
}
int main()
{
int i,j,k;
char s[MAXN];
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
getchar();
for(i=0;i<n;i++)
{
gets(s);
int cnt=0;
int len=strlen(s);
for(j=0;j<len;j++)
{
if(s[j]!=' ')
map[i][cnt++]=s[j]-'0';
}
}
memset(v,0,sizeof(v));
int num=0;
int M=-1;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(map[i][j]==1&&!v[i][j])
{
num++;
sum=0;
dfs(i,j);
M=MAX(M,sum);
}
}
}
printf("%d %d\n",num,M*k);
}
return 0;
}


引水工程

时间限制:2000 ms  |  内存限制:65535 KB

描述
南水北调工程是优化水资源配置、促进区域协调发展的基础性工程,是新中国成立以来投资额最大、涉及面最广的战略性工程,事关中华民族长远发展。“南水北调工程”,旨在缓解中国华北西北地区水资源短缺的国家战略性工程。就是把中国长江流域丰盈的水资源抽调一部分送到华北和西北地区。我国南涝北旱,南水北调工程通过跨流域的水资源合理配置,促进南北方经济、社会与人口、资源、环境的协调发展。
整个工程分东线、中线、西线三条调水线。东线工程位于东部,因地势低需抽水北送至华北地区。中线工程从汉水与其最大支流丹江交汇处的丹江口水库引水,自流供水给黄淮海平原大部分地区,20多座大中城市;西线工程在青藏高原上,由长江上游向黄河上游补水。
现在有N个区域需要建设水资源工程,它们可以自建水库解决缺水问题,也可以从已有水源的地区建立管道引水过来。当然,这些建设都需要大量投资。
你能不能给出一个优化水资源配置方案,在保证每个区域都能用上水的前提下,使得整个引水工程费用最低。
输入第一行: K 表示有多少组测试数据。
接下来对每组测试数据:
第1行: N 表示有N个区域( 1<=N<=300 )
第2 行: W1 W2 …. WN Wi表示第i个区域自建水库需要的费用
再有N行: Pi1 Pi2 …. Pin Pij表示建立第i个区域与第j个区域引水管道的费用
输出对于每组测试数据,输出占一行,即建立整个引水工程的最小费用。样例输入
1


5


5 4 4 3 6


0 2 2 2 2


2 0 3 3 3


2 3 0 4 5


2 3 4 0 1


2 3 5 1 0

样例输出
10


建一个虚拟结点,表示自建水库的费用,然后就是prim就行了

ac代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define MAXN 330
#define INF 0xfffffff
#define MIN(a,b) a>b?b:a
using namespace std;
int pri[MAXN][MAXN];
int dis[MAXN];
int self[MAXN];
int v[MAXN];
int n,sum;
void prime()
{
int i,j,k,M;
memset(v,0,sizeof(v));
for(i=0;i<=n;i++)
dis[i]=pri[0][i];
for(i=0;i<=n;i++)
{
M=INF;
for(j=0;j<=n;j++)
{
if(dis[j]<M&&!v[j])
{
k=j;
M=dis[j];
}
}
if(M==INF)
return;
v[k]=1;
sum+=M;
for(j=0;j<=n;j++)
{
if(pri[k][j]<dis[j]&&!v[j])
dis[j]=pri[k][j];
}
}
}
int main()
{
int t,i,j,num;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&pri[0][i]);
pri[i][0]=pri[0][i];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&num);
pri[i][j]=num;
}
}
sum=0;
prime();
printf("%d\n",sum);
}
return 0;
}

Interference Signal

时间限制:2000 ms  |  内存限制:65535 KB

描述
Dr.Kong’s laboratory monitorsome interference signals. The interference signals can be digitized into aseries of positive integer. May be, there are
N integers a1,a2,…,an.

 
Dr.Kong wants toknow the
averagestrength of a contiguous interference signal block.
the block mustcontain at least M integers.
 
Pleasehelp Dr.Kong tocalculate the
maximumaverage strength, giventhe constraint.
输入The input contains K test cases. Each test case specifies:

* Line 1: Two space-separated integers, N and M.

* Lines2~line N+1: ai (i=1,2,…,N)

1 ≤ K≤ 8, 5 ≤ N≤ 2000, 1 ≤ M ≤ N, 0 ≤ ai ≤9999
输出For each test case generate a single line containing a single integer that is 1000 times the maximal average value. Do not perform rounding.样例输入
2 10 6


6


4


2


10


3


8


5


9


4


1


5 2


10


3


8


5


9

样例输出
6500


7333

题意:一个数组,求连续的长度至少为m的一段数组的最大平均值

直接暴力

ac代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define MAXN 2010
#define INF 0xfffffff
#define MAX(a,b) a>b?a:b
using namespace std;
int num[MAXN];
int main()
{
int t,i,j,n,m,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&num[i]);
int M,max=-1;
int sum;
for(k=m;k<=n;k++)
{
M=-1;
for(i=1;i<=n-k+1;i++)
{
sum=0;
for(j=i;j<=i+k-1;j++)
{
sum+=num[j];
}
M=MAX(sum,M);
}
M=M*1000/k;
max=MAX(max,M);
}
printf("%d\n",max);
}
return 0;
}
啊啊啊啊,写着写着不想写了,太水了,不写了!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: