Biathlon Track
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的更多相关文章
- codeforces 424D Biathlon Track
codeforces 424D Biathlon Track 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define f ...
- Codeforces Round #242 (Div. 2) <A-D>
CF424 A. Squats 题目意思: 有n(n为偶数)个x和X,求最少的变换次数,使得X的个数为n/2,输出变换后的序列. 解题思路: 统计X的个数ans,和n/2比較,少了的话,须要把n/2- ...
- How to accept Track changes in Microsoft Word 2010?
"Track changes" is wonderful and remarkable tool of Microsoft Word 2010. The feature allow ...
- IEEE/ACM ASONAM 2014 Industry Track Call for Papers
IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...
- 使用angular中ng-repeat , track by的用处
我们见到最简单的例子是: <div ng-repeat="link in links" ></div> 如果item的值有重复的,比如links=[&quo ...
- 解密FFmpeg播放track mode控制
上一篇文章(http://www.cnblogs.com/yangdanny/p/4421130.html)我们解决了在FFmpeg下如何处理H264和AAC的扩展数据,根据解出的NALU长度恢复了H ...
- [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> 改写为: ...
- track by
ng-repeat指令中使用track by子语句解决重复数据遍历的错误 <li ng-repat="x in [2, 2]" ng-bind="x"&g ...
- [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 ...
随机推荐
- android 42 获取图片
资源中获取图片:可以从工程assets文件夹.res/drawble文件夹.sd卡.服务端下载图片. 页面: <LinearLayout xmlns:android="http://s ...
- tcp ip参数详解
http://www.cnblogs.com/digdeep/p/4869010.html 1. TCP/IP模型 我们一般知道OSI的网络参考模型是分为7层:“应表会传网数物”——应用层,表示层,会 ...
- Java编程陷阱-类成员初始化
原文地址:http://blog.csdn.net/veryitman/article/details/6450523 如果你忽略Java的细节,恐怕你的代码会充满bug,下面讨论关于类成员初始化问题 ...
- AIX系统上压缩与解压文件
压缩. 命令格式: #tar -cvf (或xvf)+文件名+设备 C:是本地到其他设备 x:是其他设备到本地 r:是追加,比如打包时,将其他文件追加进来使用该参数. t:显示tar包里的内容,但还原 ...
- RHEL7安装配置TigerVNC
TigerVNC使用非加密的链接,默认会被firewalld blocked 掉,想要 vnc正常工作就需要让firewalld开放相应的端口才行. vnc默认的端口号为5900,而每个vnc win ...
- python版本简历
- sql知识点的积累和使用过的例子
越来越发现自己的sql方面的知识的欠缺,所以只能放低姿态一点一点的学了 一 游标和charIndex的使用. 游标我一直没用过,以前只是在同事们写的存储过程里见过,但是一直没看明白(可是我就是比较笨吧 ...
- HTML5 History对象,Javascript修改地址栏而不刷新页面(二)
一.实例说明: $('#btnOne').click(function () { var stateObject = { id: 1 }; var title = "本地首页"; ...
- android 数字键盘制作
//布局相关<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android ...
- Android WebView和JavaScript交互
JavaScript在现在的网页设计中用得很多,Android 的WebView可以载入网页,WebView也设计了与JavaScript通信的桥梁.这篇主要介绍一下WebViewk控件如何和Java ...