HDU-1794 方格填数 (贪心+四分)
题目大意:给一个由自然数构成的nxn方阵,其中有k个元素为0,现在要从给出的m个元素中挑出k个填入矩阵,是和的增量最大。和定义为所有子方阵上的元素之和。
题目分析:对于尺寸固定的方阵,计算和的时候每个元素做加数的次数是可以求出的,只需将最大的数放入做加数次数最多的位置,以此类推,便得到答案。要预先处理出每个位置上的元素做加数的次数,我用的四分。
代码如下:
# include<cstdio>
# include<cstring>
# include<iostream>
# include<algorithm>
using namespace std;
# define LL long long int n,m,a[35][35][35];
int b[1000],w[10005]; void dfs(int id,int x,int y,int r,int c)
{
if(r==1||c==1){
if(r==1&&c==1){
++a[id][x][y];
return ;
}else{
if(r==1){
dfs(id,x,y,r,c/2);
dfs(id,x,y+c/2,r,c-c/2);
}else if(c==1){
dfs(id,x,y,r/2,c);
dfs(id,x+r/2,y,r-r/2,c);
}
}
}else{
dfs(id,x,y,r/2,c/2);
dfs(id,x,y+c/2,r/2,c-c/2);
dfs(id,x+r/2,y,r-r/2,c/2);
dfs(id,x+r/2,y+c/2,r-r/2,c-c/2);
}
} void init()
{
memset(a,0,sizeof(a));
for(int id=1;id<=30;++id)
for(int l=1;l<=id;++l)
for(int i=0;i+l-1<id;++i)
for(int j=0;j+l-1<id;++j)
dfs(id,i,j,l,l);
} int main()
{
init();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int k=0,x;
for(int i=0;i<n;++i)
for(int j=0;j<n;++j){
scanf("%d",&x);
if(!x) w[k++]=a[n][i][j];
}
scanf("%d",&m);
for(int i=0;i<m;++i)
scanf("%d",b+i);
sort(b,b+m);
sort(w,w+k);
LL ans=0;
for(int i=1;i<=k;++i)
ans+=(LL)w[k-i]*(LL)b[m-i];
printf("%lld\n",ans);
}
return 0;
}
HDU-1794 方格填数 (贪心+四分)的更多相关文章
- 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...
- java算法 蓝桥杯(题+答案) 方格填数
6.方格填数 (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...
- 蓝桥杯比赛javaB组练习《方格填数》
方格填数 如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+ ( ...
- HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]
题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...
- java算法 第七届 蓝桥杯B组(题+答案) 6.方格填数
6.方格填数 (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...
- c++_方格填数(最新方法)
方格填数 如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+ (如果显示有问题,也可以参 ...
- 第七届蓝桥杯试题c/c++A组方格填数 回溯法
方格填数如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+(如果 ...
- 第七届蓝桥杯javaB组真题解析-方格填数(第六题)
题目 /* 方格填数 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显 ...
- DFS(深度优先搜索遍历求合格条件总数)--07--DFS--蓝桥杯方格填数
此题方法多种,我用规范的DFS来求解 题目:方格填数 如下的10个格子,填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻)一共有多少种可能的填数方案? 输出 请填写表示 ...
- java实现第七届蓝桥杯方格填数
方格填数 题目描述 如下的10个格子 +--+--+--+ | | | | +--+--+--+--+ | | | | | +--+--+--+--+ | | | | +--+--+--+ (如果显示 ...
随机推荐
- git学习------> 解决Gitlab 版本升级之后,发送 merge request 出现 http 500 的返回码错误
今天有同事在Gitlab上发送 Merge Request的时候,直接出现如下所示的界面,提示http 500,服务器内部出错. 一.错误描述 1.1 创建新的 Merge Request 1.2 填 ...
- Google I/O 2014 - Keynote for Android
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jingxia2008/article/details/34809467 Google I/O 201 ...
- Scala的类与类型
类和类型 List<String>和List<Int>类型是不一样的,但是jvm运行时会采用泛型擦除.导致List<String>和List<Int>都 ...
- 一个Spark job的生命历程
一个job的生命历程 dagScheduler.runJob //(1) --> submitJob ( eventProcessLoop.post(JobSubmitted,***) //(2 ...
- zlib编译安装
从http://www.zlib.net/下载了最新的源代码 zlib提供了vs sln文件,在zlib-1.2.8\contrib\vstudio\目录有 其中的zlibstat是编译为静态库zli ...
- vue小toast插件报错runtine-only
var Toast={}; Toast.install = function (Vue, options) { let opt = { defaultType:'bottom', // 默认显示位置 ...
- 2016 CCPC 长春 Solution
A - Hanzo vs. Genji 留坑. B - Fraction 水. #include <bits/stdc++.h> using namespace std; inline i ...
- Python: 分数运算
fractions 模块可以被用来执行包含分数的数学运算 >>> from fractions import Fraction >>> a = Fraction(5 ...
- UVA11090 Going in Cycle!!(二分判负环)
UVA11090 Going in Cycle!! 二分答案,用spfa判负环. 注意格式:图不一定连通. 复杂度$O(nmlog(maxw-minw))$ #include<iostream& ...
- Flask 6 模板2
NOTE Jinja2提供了多种控制程序,可以用来改变模板的渲染流程. 1.在模板中使用条件控制语句: templates/condition.html: {% if user %} Hello, { ...