【Luogu3444】ORK-Ploughing(贪心)

题面

Luogu

题解

我们知道,如果我们选定了以横向为主,或者纵向为主,

那么就有尽可能减少另一个方向上耕地的次数

所以分开贪心,但是本质相同,所以接下来只考虑纵向为主

既然确定了以纵向为主,那么就要尽可能减少横向操作的次数

所以,只要能够纵向耕地,就不考虑横向耕地

可是,如果到了某个时候,纵向无法耕了

此时必须横向耕

但是我们不知道应该从上面开始还是下面开始

为了解决这个问题

我们假设上面最多耕的次数是有限次

换种想法,我们假设上面至少耕这么多次

既然上面的次数确定,那么下方的耕地次数越少越好

所以耕地的优先级:

左-右-上-下

只要能够耕就一定耕

这样,枚举-贪心的做法就可以做啦

横向、纵向分别算一遍

时间复杂度O((n+m)^2)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 2222
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int K,m,n,ans=1e9;
int g[MAX][MAX];
int sl[MAX][MAX],sr[MAX][MAX];
int Work1(int up)
{
int l1=1,l2=n,r1=1,r2=m,ret=0,ss;
while(l1<=l2&&r1<=r2)
{
++ret;
ss=sr[l2][r1]-sr[l1-1][r1];
if(ss<=K){++r1;continue;}
ss=sr[l2][r2]-sr[l1-1][r2];
if(ss<=K){--r2;continue;}
ss=sl[l1][r2]-sl[l1][r1-1];
if(ss<=K&&l1<up){++l1;continue;}
ss=sl[l2][r2]-sl[l2][r1-1];
if(ss<=K){--l2;continue;}
ret=1e9;break;
}
return ret;
}
int Work2(int left)
{
int l1=1,l2=n,r1=1,r2=m,ret=0,ss;
while(l1<=l2&&r1<=r2)
{
++ret;
ss=sl[l1][r2]-sl[l1][r1-1];
if(ss<=K){++l1;continue;}
ss=sl[l2][r2]-sl[l2][r1-1];
if(ss<=K){--l2;continue;}
ss=sr[l2][r1]-sr[l1-1][r1];
if(ss<=K&&r1<left){++r1;continue;}
ss=sr[l2][r2]-sr[l1-1][r2];
if(ss<=K){--r2;continue;}
ret=1e9;break;
}
return ret;
}
int main()
{
freopen("ork.in","r",stdin);
freopen("ork.out","w",stdout);
K=read();m=read();n=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
g[i][j]=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
sl[i][j]=sl[i][j-1]+g[i][j];
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
sr[i][j]=sr[i-1][j]+g[i][j];
for(int i=1;i<=n;++i)
ans=min(ans,Work1(i));
for(int i=1;i<=m;++i)
ans=min(ans,Work2(i));
printf("%d\n",ans);
return 0;
}

【Luogu3444】ORK-Ploughing(贪心)的更多相关文章

  1. [POI2006]ORK-Ploughing(贪心,枚举)

    [POI2006]ORK-Ploughing 题目描述 Byteasar, the farmer, wants to plough his rectangular field. He can begi ...

  2. 洛谷P3444 [POI2006]ORK-Ploughing [枚举,贪心]

    题目传送门 ork 格式难调,题面就不放了. 分析: 一道偏难的贪心和枚举题.考试的时候是弃疗了...yyb巨佬已经讲的很详细了,推荐他的博客.这里小蒟蒻就只放代码了. Code: #include& ...

  3. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  4. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  5. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]

    1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 786  Solved: 391[Submit][S ...

  7. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  8. 【BZOJ-4245】OR-XOR 按位贪心

    4245: [ONTAK2015]OR-XOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 486  Solved: 266[Submit][Sta ...

  9. code vs 1098 均分纸牌(贪心)

    1098 均分纸牌 2002年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解   题目描述 Description 有 N 堆纸牌 ...

随机推荐

  1. setfacl命令 来自: http://man.linuxde.net/setfacl

    常用选项##### <pre>-b,--remove-all:删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留. -k,--remove-default:删除缺省的 ...

  2. Git 如何 clone 非 master 分支的代码

    问题描述 我们每次使用命令 git clone git@gitlab.xxx.com:xxxxx.git 默认 clone 的是这个仓库的 master 分支.如果最新的代码不在 master 分支上 ...

  3. Ubuntu配置Nginx虚拟主机和支持ThinkPHP

    [Nginx配置虚拟主机] 每一个 server { listen       80;         server_name  www.a.com; ..... } 就表示一台虚拟域名, 然后对应的 ...

  4. vim操作备忘录

    vim操作备忘录 vim 备忘录 vim的书籍虽然看不不少,可是老是容易忘记,主要是自己操作总结过少,这个博客就主要用来记录一些比较常见的术语和操作,以防止自己再次忘记. <leader> ...

  5. java定时器schedule和scheduleAtFixedRate区别

    package cn.lonecloud.test; import java.util.Date; import java.util.Timer; import java.util.TimerTask ...

  6. LeetCode第七天

    ==数组 Medium== 40.(162)Find Peak Element JAVA //斜率思想,二分法 class Solution { public int findPeakElement( ...

  7. Golang http 服务器

    package main import ( "net/http" "fmt" ) func main() { app := http.NewServeMux() ...

  8. PV和UV的简单记录

    1.什么是PV值 PV(page view)即页面浏览量或点击量,是衡量一个网站或网页用户访问量.具体的说,PV值就是所有访问者在24小时(0点到24点)内看了某个网站多少个页面或某个网页多少次.PV ...

  9. AWS EC2 通过Linux终端:使用ssh连接到Linux实例

    AWS的ubuntu主机登录用户是ubuntu 只能通过秘钥的方式登录 如果在linux终端通过ssh远程登录步骤如下: 假如申请EC2主机的时候下载的key名称叫my-key.pem,并保存在本地l ...

  10. java数组:去重,增加,删除元素

    import java.util.List; import java.util.ArrayList; import java.util.Set; import java.util.HashSet; p ...