博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 10641 (来当雷锋的这回....)
阅读量:7041 次
发布时间:2019-06-28

本文共 2320 字,大约阅读时间需要 7 分钟。

#include
#include
#include
#include
using namespace std;const double eps = 1e-6;const int inf = 0x3f3f3f3f;int n,m;int f[100];struct point{ double x,y; point(double xx = 0,double yy = 0){ this->x = xx; this->y = yy; } void read(){ scanf("%lf%lf",&x,&y); }}p[100];struct Q{ int l,r,c;}q[1005];bool judge(point pp,point p1,point p2){///向量叉积。推断顺逆时针时注意三个点的先后位置 /// <0是就是第一个向量在第二个向量的逆时针方向; return ((p1.x-pp.x)*(p2.y-pp.y)-(p2.x-pp.x)*(p1.y - pp.y)) < -eps;}Q tra(point t,int c){ Q ans; bool flag[100]; memset(flag,false,sizeof(flag)); for(int i = 0; i < n; i++){ if(judge(t,p[i],p[i+1])){///推断能不能照到这条边 ///(实际上推断转化成了照到点); flag[i] = true; } } ///以下是处理得出的数据,保存下每一个灯所能照到的最左端和最右端; if(flag[n-1]&&flag[0]){ int left = n-1; while(flag[left-1]){left--;} int right = 0; while(flag[right+1]){right++;} ans.l = left; ans.r = right + n; } else{ int left = 0,right = n-1; while(!flag[left]){left++;} while(!flag[right]){right--;} ans.l = left; ans.r = right; } ans.c = c; return ans;}bool solve(){ int ans = inf; for(int i = 0; i < n; i++){ memset(f,inf,sizeof(f)); f[i] = 0; for(int j = 0; j < n; j++){ int r = i + j;///从第i个点開始往后数了j个; ///多定义这么一个层次,能够使状态的转移变得有序 for(int k = 0; k < m; k++){ if(q[k].l > r) continue;///当前点与该灯照亮的最左点之间有空隔,就不符合開始更新的条件; if(q[k].r < r) continue;///这是个剪枝,去掉也对;就是不再考虑不会成为最优解的情况; int now = min(q[k].r + 1, i + n);///依据区间右端点往后更新。可是一旦更新过了i+n就要将端点定为i+n; f[now] = min(f[now],f[r] + q[k].c); } } ans = min(ans,f[i+n]); } if(ans == inf) return false; printf("%d\n",ans); return true;}int main(){ while(scanf("%d",&n) != EOF){ if(n == 0) break; for(int i = 0; i < n; i++){ p[i].read(); } p[n] = p[0]; scanf("%d",&m); point temp;int c; for(int i = 0; i < m; i++){ temp.read(); scanf("%d",&c); q[i] = tra(temp,c); } if(!solve()) printf("Impossible.\n"); } return 0;}

转载地址:http://yjxal.baihongyu.com/

你可能感兴趣的文章
用Javascript获取页面元素的位置
查看>>
electron 学习笔记
查看>>
vs 开发 qt 遇到 无法找到 Visual Studio 2010 的生成工具(平台工具集 =“v100”) 解决方案...
查看>>
Oracle死锁处理实例
查看>>
[转]Android Studio创建Xposed模块项目时BridgeApi的正确添加方式
查看>>
【hive】——Hive sql语法详解
查看>>
python 全栈开发,Day50(Javascript简介,第一个JavaScript代码,数据类型,运算符,数据类型转换,流程控制,百度换肤,显示隐藏)...
查看>>
一篇网络流的好blog
查看>>
Python基础之继承与派生
查看>>
filter、map、every函数的使用
查看>>
黑马程序员——iOS学习——UITableView表视图单元样式
查看>>
Bash基础——减号-
查看>>
Android适配文件dimen自动生成代码
查看>>
走马观花--快餐学python笔记
查看>>
jquery轻量级富文本编辑器Trumbowyg
查看>>
(二十八)static关键字
查看>>
vue条件渲染
查看>>
转 MySQL数据库基础
查看>>
ubuntu 解压命令全部
查看>>
Chrome教程(一)NetWork面板分析网络请求
查看>>