Faucet Flow UVA
来源:互联网 发布:淘宝店铺内衣名字大全 编辑:程序博客网 时间:2024/05/21 08:42
主要就是模拟这题,实在是比较坑,个人代码写的很长,很无奈。
大体要分情况讨论:
1: 确定最终从哪一边流出,也就是先确定左边最高的板子和右边最高的板子哪一个更高。 如果相同高度的话就是左右两边都可能流出,那就取时间最短的那个。
2:还有很多小细节,这个要自己做的时候慢慢想,做这种题还是很考验耐心的,因为没有什么算法,这也就不赘述了,具体过程还是自己慢慢体会吧。
留个纪念,纪念这个坑。
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<map>using namespace std;map<int,int> op;int l,r;int main(){while(scanf("%d %d",&l,&r) != EOF){if(l==0&&r==0)break;//op.clear();int ll = l;int rr = r;int tmp;int maxl = 0;int maxr = 0;int tmpl = -1;int tmpr = 1; while(ll<=r){ scanf("%d",&tmp); op[ll] = tmp; ll += 2;}ll = -1;rr = 1;while(rr <= r){if(op[rr]>=maxr){maxr=op[rr]; tmpr = rr;}rr += 2;}while(ll>=l){if(op[ll]>=maxl){maxl=op[ll];tmpl = ll;}ll -= 2;}int v = 0;if(maxl > maxr)// 肯定右边流出 {int v1=0, v2=0;// 更新左边,for(int ww=-1; ww>=l; ww -= 2){ if(op[ww] >= maxr){maxl = op[ww]; tmpl = ww; break;}} if(maxl!=maxr){v = maxr*(tmpr-tmpl); // tmpl ,maxl 不变 maxr = 0;int pre; while(tmpr < r){pre = tmpr;maxr = 0;for(int w = tmpr+2; w<=r; w += 2){if(op[w] >= maxr){maxr = op[w]; tmpr = w;}} v += maxr*(tmpr-pre); if(tmpr==r) break; } cout << v << endl;} else if(maxl==maxr) { for(int ww=1; ww<=r; ww +=2) { if(op[ww]==maxr){tmpr=ww;break;} }v1 = maxr*(tmpr-tmpl); // tmpl ,maxl 不变 int v11 = 0;maxr = 0;int pre; int ok = min(tmpr,-tmpl);//tmpr = ok;while(tmpr < r){pre = tmpr;maxr = 0;for(int w = tmpr+2; w<=r; w += 2){if(op[w] >= maxr){maxr = op[w]; tmpr = w;}} v11 += maxr*(tmpr-pre); if(tmpr==r) break; } //tmpl = -ok; int aa,bb;for(int i=tmpl-2; i>=l; i -= 2){if(op[i] > maxl){aa=op[i],bb=i;break;}}int chucun = (tmpl-bb)*(maxl);if(chucun >= v11){cout << v1 + v11*2 << endl; }else if(chucun < v11){cout << v1 + chucun*2 + (v11-chucun) << endl; } }}else if(maxl < maxr) // 肯定从左边流出 {//更新右边 int v1,v2;for(int ww=1; ww<=r; ww+=2){if(op[ww]>=maxl){maxr=op[ww];tmpr=ww;break;}}if(maxl != maxr){v = maxl*(-tmpl+tmpr); // tmpr, maxr 不变; maxl = 0;int pre;while(tmpl > l){ pre = tmpl; maxl = 0; for(int w=tmpl-2; w>=l; w -= 2) { if(op[w] >= maxl){maxl = op[w]; tmpl = w;} } v += (pre-tmpl)*maxl; if(tmpl==l)break;} cout << v << endl; } else if(maxl==maxr) { for(int ww=-1; ww>=l; ww -= 2) { if(maxl==op[ww]){tmpl=ww;break;}}v1 = maxl*(tmpr-tmpl); // tmpr, maxr 不变;int ok = min(-tmpl,tmpr);int v11 = 0; maxl = 0;int pre;//tmpl = -ok;while(tmpl > l){ pre = tmpl; maxl = 0; for(int w=tmpl-2; w>=l; w -= 2) { if(op[w] >= maxl){maxl = op[w]; tmpl = w;} } v11 += (pre-tmpl)*maxl; if(tmpl==l)break;} //tmpr = ok; int aa,bb;for(int i=tmpr+2; i<=r; i += 2){if(op[i] > maxr){aa=op[i],bb=i;break;}}int chucun = (bb-tmpr)*(maxr);if(chucun >= v11){cout << v1 + v11*2 << endl; }else if(chucun < v11){cout << v1 + chucun*2 + (v11-chucun) << endl; } }} else if(maxl == maxr){ for(int ww=1; ww<=r; ww += 2) { if(op[ww]==maxl){tmpr=ww;break;} } for(int ww=-1; ww>=l; ww -= 2) { if(op[ww]==maxr){tmpl=ww;break;} } v = (tmpr-tmpl)*maxl; // 所有都变。 // cout << tmpr << " " << tmpl << endl; int vl = v; int vr = v; // 两边各走一遍,选最小的 // 右边走 //int cccc = maxr; maxr = 0;int pre;while(tmpr < r){pre = tmpr;maxr = 0;for(int w = tmpr+2; w<=r; w += 2){if(op[w] >= maxr){maxr = op[w]; tmpr = w;}} vr += 2*maxr*(tmpr-pre); if(tmpr==r) break; } // 左边走 //maxr = cccc; maxl = 0; int pre2;while(tmpl > l){ pre2 = tmpl; maxl = 0; for(int w=tmpl-2; w>=l; w -= 2) { if(op[w] >= maxl){maxl = op[w]; tmpl = w;} } vl += 2*(pre2-tmpl)*maxl; if(tmpl==l)break;} //cout << vl << " " << vr << endl; cout << min(vl,vr) << endl;}}return 0;}
水波.
阅读全文
0 0
- UVa - 10366 - Faucet Flow
- uva 10366 - Faucet Flow
- Faucet Flow UVA
- uva 10366 - Faucet Flow(贪心)
- UVA 10366 - Faucet Flow(贪心+模拟细节)
- UVa #10366 Faucet Flow (习题8-24)
- 10366 Faucet Flow【贪心】【模拟】
- UVA 10842 Travel Flow
- UVa 10842 - Traffic Flow
- UVA 10779 【maximum flow】
- uva 10594Data Flow
- uva 10594 - Data Flow(费用流)
- UVA 10594 - Data Flow(费用流)
- UVA 10594 Data Flow (最小费用流)
- Data Flow - UVa 10594 费用流
- flow
- flow
- flow
- Linux下epoll实现简单的C/S通信
- java中代码实现获取IP
- 对于POJ 1182 食物链 问题的详细分析加代码
- 欢迎使用CSDN-markdown编辑器
- 开启应用调试属性
- Faucet Flow UVA
- C#打印日志
- Android adb.exe程序启动不起来
- 快速排序
- ZigBee TI ZStack CC2530 2.4 IAR软件版本
- Js简单实现返回顶部按钮功能
- Tegra X2 系统上安装 openpose
- C++ 中 dynamic_cast 浅析
- java输入一个字符串,然后分割出内部的各个部分