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

来源:互联网 发布:淘宝卖家开店时间查询 编辑:程序博客网 时间:2024/05/21 14:42

最大岛屿

时间限制: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:busing 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:ausing 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 areN 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 themaximumaverage 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:busing 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;}

啊啊啊啊,写着写着不想写了,太水了,不写了!!!!闭嘴


0 0
原创粉丝点击