国庆开始只切了几道水题,想了想还是记录一下吧
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;
}
啊啊啊啊,写着写着不想写了,太水了,不写了!!!!
相关文章推荐
- linux,shell后台启动一个死循环程序不停输出信息,当关闭shell后重新打开为嘛没输出了
- hdu 4825 Xor Sum
- CCProgressTo 和CCProgressTimer
- 计算机四则运算
- 切换默认Activity和Fragment的动画
- CentOS 7 主机名的修改
- hdu(2141)——Can you find it?
- 向量及其运算
- Java堆和native堆
- Best Time to Buy and Sell Stock III
- [转载学习]
- c++遍历文件夹中的图片(或文件)
- ios 动态设置Cell高低
- UICollectionView的使用
- 数据源1
- BZOJ 2186-[Sdoi2008]沙拉公主的困惑(乘法逆元)
- 如何终止java线程
- hdu 5430(几何)
- hdu 5430(几何)
- LintCode 删除排序数组中的重复数字 II