JLOI金属切割

时间限制:

1000

空间限制:

512000

xjb乱搞的码农题.

对切边的顺序搞全排列.

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<cmath>
  5 using namespace std;
  6 const int N=15;
  7 long double c[N],a[N],b[N],x[N],y[N],K[N],B[N],ans=1e20,n,m;
  8 int w,ord[N];
  9 bool used[N],upst[N];
 10 inline void calline(int t)
 11 {
 12     if(x[t]==x[t+1]) upst[t]=1;
 13     else
 14     {
 15         K[t]=(y[t]-y[t+1])/(x[t]-x[t+1]);
 16         B[t]=y[t]-K[t]*x[t];
 17         a[t]=y[t]-y[t+1];
 18         b[t]=x[t+1]-x[t];
 19         c[t]=x[t]*y[t+1]-x[t+1]*y[t];
 20         upst[t]=0;
 21     }
 22 }
 23 inline void getmin()
 24 {
 25     long double Xl,Xr,x1,x2,xx,X,res=0;
 26     for(int i=1;i<=w;i++)
 27     {
 28         if(upst[ord[i]])
 29         {
 30             Xl=0;
 31             Xr=m;
 32             x1=y[ord[i]];
 33             x2=y[ord[i]+1];
 34             if(x1>x2) swap(x1,x2);
 35             X=x[ord[i]];
 36             for(int j=1;j<i;j++) if(!upst[ord[j]])
 37             {
 38                 xx=-(a[ord[j]]*X+c[ord[j]])/b[ord[j]];
 39                 if(xx<=x1&&xx>Xl) Xl=xx;
 40                 if(xx>=x2&&xx<Xr) Xr=xx;
 41             }
 42             res+=Xr-Xl;
 43             continue;
 44         }
 45         if(K[ord[i]]>0)
 46         {
 47             if(B[ord[i]]>=0) Xl=0;
 48             else Xl=-B[ord[i]]/K[ord[i]];
 49             if(K[ord[i]]*n+B[ord[i]]<=m) Xr=n;
 50             else Xr=(m-B[ord[i]])/K[ord[i]];
 51         }
 52         else if(K[ord[i]]<=0)
 53         {
 54             if(B[ord[i]]<=m) Xl=0;
 55             else Xl=(m-B[ord[i]])/K[ord[i]];
 56             if(K[ord[i]]*n+B[ord[i]]>=0) Xr=n;
 57             else Xr=-B[ord[i]]/K[ord[i]];
 58         }
 59         x1=x[ord[i]];
 60         x2=x[ord[i]+1];
 61         if(x1>x2) swap(x1,x2);
 62         for(int j=1;j<i;j++)
 63         {
 64             long double d=a[ord[i]]*b[ord[j]]-a[ord[j]]*b[ord[i]];
 65             if(d==0&&!upst[ord[j]]) continue;
 66             if(!upst[ord[j]]) xx=(b[ord[i]]*c[ord[j]]-b[ord[j]]*c[ord[i]])/d;
 67             else xx=x[ord[j]];
 68             if(xx<=x1&&xx>Xl) Xl=xx;
 69             if(xx>=x2&&xx<Xr) Xr=xx;
 70         }
 71         res+=(Xr-Xl)*sqrt(1+K[ord[i]]*K[ord[i]]);
 72     }
 73     ans=min(ans,res);
 74 }
 75 inline void list(int x)
 76 {
 77     if(x==w)
 78     {
 79         getmin();
 80         return;
 81     }
 82     for(int i=1;i<=w;i++) if(!used[i])
 83     {
 84         used[i]=1;
 85         ord[x+1]=i;
 86         list(x+1);
 87         used[i]=0;
 88     }
 89 }
 90 int main()
 91 {
 92     scanf("%Lf%Lf%d",&n,&m,&w);
 93     for(int i=1;i<=w;i++) scanf("%Lf%Lf",&x[i],&y[i]);
 94     x[w+1]=x[1];
 95     y[w+1]=y[1];
 96     for(int i=1;i<=w;i++) calline(i);
 97     memset(used,0,sizeof(used));
 98     list(0);
 99     printf("Minimum total length = %.3Lf\n",ans);
100     return 0;
101 }
时间: 2024-08-10 19:11:27

JLOI金属切割的相关文章

[JLOI 2011]飞行路线&amp;[USACO 09FEB]Revamping Trails

Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机.航空公司对他们这次旅行也推出优惠,他们可以免费在最多k种航线上搭乘飞机.那么Alice和Bob这次出行最少花费多少? Input 数据的第一行有三个整数,n,m,k,分别表示城市数,航线数和免费乘坐次数.

JLOI 斯迈利的赌注

直接高精度模拟,加上简单贪心 1 Program XJOI2263; 2 type arr=array[0..1000] of longint; 3 var a,b:arr; 4 s1,s2:ansistring; 5 i,j:longint; 6 sum:int64; 7 operator *(a:arr;x:longint) c:arr; 8 var i:longint; 9 begin 10 fillchar(c,sizeof(c),0); 11 for i:=1 to a[0] do c

动态规划(计数DP):JLOI 2016 成绩比较

Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M- 1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个整数.如果在每门课上A获得的成绩均小于等于B获 得的成绩,则称A被B碾压.在B神的说法中,G系共有K位同学被他碾压(不包括他自己),而其他N-K-1位同学则没 有被他碾压.D神查到了B神每门必修课的排名.这里的排名是指:如果B神某门课的排名为R,则表示有且仅有R-1 位同学这门课的分数大于B神的分数

计数方法(扫描线):JLOI 2016 圆的异或并

Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. Input 第一行包含一个正整数N,代表圆的个数.接下来N行,每行3个非负整数x,y,r,表示一个圆心在(x,y),半径为r的 圆.保证|x|,|y|,≤10^8,r>0,N<=200000 Output 仅一行一个整数,表示所有圆的异或面积并除以圆周率Pi的结果. Sample

BZOJ 4005 [JLOI 2015] 骗我呢

首先,我们可以得到:每一行的数都是互不相同的,所以每一行都会有且仅有一个在 $[0, m]$ 的数没有出现. 我们可以考虑设 $Dp[i][j]$ 为处理完倒数 $i$ 行,倒数第 $i$ 行缺的数字是 $j$ 的方案数. 那么就有: $$Dp[i][j] = \sum_{k=max(0,j-1)}^{m}Dp[i - 1][k]$$ 自己画一画图就可以明白了,在这里就不解释了.毕竟 Gromah 太懒($ru\grave{o}$) 然后我们考虑把这个转移图画出来: 然后就是求这个图中从左上到右

JLOI 2014--聪明的燕姿(DFS&amp;约数和定理)

写完这道题感觉人生都是灰暗的... 不存在的!!!数学学得好就知道自己等的人是谁? 这是不不不不不可能的!!!我到现在都没有女朋友!!! 题意 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁.可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数

JLOI 2015--有意义的字符串(矩阵乘法)

知道公式就不难了系列... 感觉吉林省选好变态...这还只是第一题呀... %dalaoPoPoQQQ... 看了大佬的题解...懵逼了一晚... 今天早上的时候终于想明白了!!! 于是飞快地A过此题... 题意 B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 注意:其中 0<b^2< = d<(b+1)^2< = 10^18,  n< = 10^18,并且 b mod 2=1,d mod 4=1 Solution 构造特征方程.

[BZOJ 2763][JLOI 2011] 飞行路线

2763: [JLOI2011]飞行路线 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3203  Solved: 1223[Submit][Status][Discuss] Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格.Alice和Bob现在要从一个城市沿着航线到达另一个城

JLOI 提示问题

按照题目意思模拟即可. 1 Program XJOI2265; 2 const a:array[1..10] of char=('a','e','i','o','u','A','E','I','O','U'); 3 var s:ansistring; 4 len,i,j,sum,x,y:longint; 5 flag:boolean; 6 function check(ch:char):boolean; 7 begin 8 if (ch>='A') and (ch<='Z') or (ch&g