Codeforces Round #242 (Div. 2) D:http://codeforces.com/contest/424/problem/D

题意:给你一个n*m的矩阵,每个格子上面有个数字,在相邻格子之间会有一定的费用,费用根据相邻格子的大小关系确定。让你费用最接近一个数的矩阵。

题解:一看题目,想了一下,预处理,然后猜到要用二分。但是二维的怎么二分,一直没有想到什么办法,一直想的是(n*mlog(n*m))的算法,所以不对了。其实应该固定一个起点,作为矩阵的左上角的点,然后枚举右下角的纵坐标,对于右下角的横坐标就可以二分寻找了。但是这里是找最接近的数,一开始以为二分找不到,现在才知道二分的最后可以找到的就是最接近的那个数,同时二分的写法也要注意,不能写成a[mid]<=number,这样会陷入死循环。还有,这一题要预处理出一些点的距离。其实,这一题还可以直接打暴力,四层for也是能过的。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=;
int a[N][N];
int l[N][N],r[N][N],u[N][N],d[N][N];
int n,m,t;
int tp,tu,td;
void solve(){
memset(l,,sizeof(l));
memset(r,,sizeof(r));
memset(u,,sizeof(u));
memset(d,,sizeof(d));
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
l[i][j]=l[i][j-];
if(j==)continue;
if(a[i][j]>a[i][j-])
l[i][j]+=tu;
else if(a[i][j]==a[i][j-])
l[i][j]+=tp;
else
l[i][j]+=td;
}
}
for(int i=;i<=n;i++){
for(int j=m;j>=;j--){
r[i][j]=r[i][j+];
if(j==m)continue;
if(a[i][j]>a[i][j+])
r[i][j]+=tu;
else if(a[i][j]==a[i][j+])
r[i][j]+=tp;
else
r[i][j]+=td;
}
}
for(int j=;j<=m;j++){
for(int i=;i<=n;i++){
u[i][j]=u[i-][j];
if(i==)continue;
if(a[i][j]>a[i-][j])
u[i][j]+=tu;
else if(a[i][j]==a[i-][j])
u[i][j]+=tp;
else
u[i][j]+=td;
}
}
for(int j=;j<=m;j++){
for(int i=n;i>=;i--){
d[i][j]=d[i+][j];
if(i==n)continue;
if(a[i][j]>a[i+][j])
d[i][j]+=tu;
else if(a[i][j]==a[i+][j])
d[i][j]+=tp;
else
d[i][j]+=td;
}
}
}
int getsum(int l1,int r1,int l2,int r2){
return l[l1][r2]-l[l1][r1]+u[l2][r2]-u[l1][r2]+r[l2][r1]-r[l2][r2]+d[l1][r1]-d[l2][r1];
}
int ans,x1,x2,y1,y2;
int main(){
scanf("%d%d%d",&n,&m,&t);
scanf("%d%d%d",&tp,&tu,&td);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
cin>>a[i][j];
solve();
ans=2e9;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
for(int k=j+;k<=m;k++){
int l=i+,r=n;
if(l>r)continue;
while(l<r){
int mid=(l+r)/;
int temp=getsum(i,j,mid,k);
if(temp>=t){
r=mid;
}
else
l=mid+;
}
int ts=getsum(i,j,l,k);
if(abs(ts-t)<abs(ans-t)){
ans=ts;
x1=i;y1=j;
x2=l;y2=k;
}
if(l<n){
ts=getsum(i,j,l+,k);
if(abs(ts-t)<abs(ans-t)){
ans=ts;
x1=i;y1=j;
x2=l+;y2=k;
}
}
if(l>i+){
ts=getsum(i,j,l-,k);
if(abs(ts-t)<abs(ans-t)){
ans=ts;
x1=i;y1=j;
x2=l-;y2=k;
}
}
}
}
}
printf("%d %d %d %d\n",x1,y1,x2,y2); }

Biathlon Track的更多相关文章

  1. codeforces 424D Biathlon Track

    codeforces 424D Biathlon Track 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define f ...

  2. Codeforces Round #242 (Div. 2) &lt;A-D&gt;

    CF424 A. Squats 题目意思: 有n(n为偶数)个x和X,求最少的变换次数,使得X的个数为n/2,输出变换后的序列. 解题思路: 统计X的个数ans,和n/2比較,少了的话,须要把n/2- ...

  3. How to accept Track changes in Microsoft Word 2010?

    "Track changes" is wonderful and remarkable tool of Microsoft Word 2010. The feature allow ...

  4. IEEE/ACM ASONAM 2014 Industry Track Call for Papers

    IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...

  5. 使用angular中ng-repeat , track by的用处

    我们见到最简单的例子是: <div ng-repeat="link in links" ></div> 如果item的值有重复的,比如links=[&quo ...

  6. 解密FFmpeg播放track mode控制

    上一篇文章(http://www.cnblogs.com/yangdanny/p/4421130.html)我们解决了在FFmpeg下如何处理H264和AAC的扩展数据,根据解出的NALU长度恢复了H ...

  7. [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys

    错误原因在于出现相同内容. 原写为: <li ng-repeat="log in logs" scroll-down> {{log}}</li> 改写为: ...

  8. track by

    ng-repeat指令中使用track by子语句解决重复数据遍历的错误 <li ng-repat="x in [2, 2]" ng-bind="x"&g ...

  9. [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify uniq

    angularjs 使用ng-repeat报错 <div ng-init="words = ['高校','高校','高校']" ng-repeat="word in ...

随机推荐

  1. Linux系统的Cache工作原理和管理机制

    Linux系统Cache 管理是 Linux 内核中一个很重要并且较难理解的组成部分.本文详细介绍了 Linux 内核中文件 Cache 管理的各个方面,希望能够帮助到你. 操作系统和文件 Cache ...

  2. android 51 有序广播

    无序广播:一条广播发送出去,多个接收者接收没有顺序.有序广播:广播接收者可以设置优先级,优先级高的先收到广播.有序广播可以设置优先级. mainActivity.java package com.sx ...

  3. CakePHP之控制器

    控制器 控制器是MVC中的“C”. 如果你的网站使用Cake框架制作,一般根据url地址和通过路由,就会找到正确的控制器,然后控制器的动作就会被调用. 一个控制器需要解释请求数据.确保使用正确的模型. ...

  4. JS中escape 方法和C#中的对应

    在项目中遇到js中escape过的json字符串,需要在C#中对应模拟编码,记得原来遇到过这个问题,但是当时没记录下来方案, 于是又搜索了一番,发现别人说的都是HttpUtility.UrlEncod ...

  5. linux常用命令之tail

    从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的 ...

  6. KAFKA分布式消息系统[转]

    KAFKA分布式消息系统  转自:http://blog.chinaunix.net/uid-20196318-id-2420884.html Kafka[1]是linkedin用于日志处理的分布式消 ...

  7. iOS 使用 FFmpeg

    iOS 使用 FFmpeg 字数486 阅读288 评论7 喜欢5 集成 下载FFmpeg For iOS编译脚本: 打开 terminal 执行sh build-ffmpeg.sh: 步骤2执行完成 ...

  8. 读懂IL代码(二)

    上一篇提到了最基本的IL代码,应该是比较通俗易懂的,所以有了上一篇的基础之后,这篇便要深入一点点的来讲述了. 首先我必须再来说一些重要的概念: Evaluation Stack(评估栈):这是由.NE ...

  9. [转]Mysql导入导出工具Mysqldump和Source命令用法详解

    Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式( ...

  10. 常见ORACLE错误,及解决方案(遇则即时更新)

    1.当登陆时提示“ORA-03113:通信通道的文件结束”时:        解决方案:                     需在X:\oraclexe\app\oracle\product\10 ...