描述

http://www.lydsy.com/JudgeOnline/problem.php?id=1027

分析

 1 #include <bits/stdc++.h>
2 using namespace std;
3
4 const int maxn=500+5;
5 const double eps=1e-10,INF=1<<27;
6 int n,m;
7 int d[maxn][maxn];
8 inline int dcmp(double x){
9     if(fabs(x)<eps) return 0;
10     return x>0?1:-1;
11 }
12 struct pt{
13     double x,y;
14     pt(double x=0,double y=0):x(x),y(y){}
15     pt operator - (const pt &a) const { return pt(x-a.x,y-a.y); }
16     double operator * (const pt &a) const { return x*a.y-y*a.x; }
17     double operator ^ (const pt &a) const { return x*a.x+y*a.y; }
18     bool operator != (const pt &a) const { return (dcmp(a.x-x)||dcmp(a.y-y)); }
19 }a[maxn],b[maxn];
20 inline bool spj(){
21     for(int i=1;i<=m;i++){
22         bool flag=true;
23         for(int j=1;j<=n;j++)if(a[i]!=b[j]){
24             flag=false;
25             break;
26         }
27         if(flag) return true;
28     }
29     return false;
30 }
31 inline bool J(pt p1,pt p2){
32     for(int i=1;i<=n;i++)if(dcmp((b[i]-p1)^(b[i]-p2))>0) return false;
33     return true;
34 }
35 inline int C(pt p1,pt p2){
36     int l=0,r=0;
37     for(int i=1;i<=n;i++){
38         double t=(p2-p1)*(b[i]-p1);
39         if(dcmp(t)>0) l++;
40         else if(dcmp(t)<0) r++;
41         if(l&&r) return 0;
42     }
43     if(!l&&!r&&J(p1,p2)) return 3;
44     if(l) return 1;
45     if(r) return 2;
46     return 0;
47 }
48 inline void floyd(){
49     for(int k=1;k<=m;k++)for(int i=1;i<=m;i++)for(int j=1;j<=m;j++)
50         d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
51     int ans=INF;
52     for(int i=1;i<=m;i++) ans=min(ans,d[i][i]);
53     if(ans==INF){ puts("-1"); return; }
54     printf("%d\n",ans);
55 }
56 inline void solve(){
57     if(spj()){ puts("1"); return; }
58     for(int i=1;i<=m;i++)for(int j=i+1;j<=m;j++){
59         int flag=C(a[i],a[j]);
60         if(flag==1) d[i][j]=1;
61         else if(flag==2) d[j][i]=1;
62         else if(flag==3) d[i][j]=d[j][i]=1;
63     }
64     floyd();
65 }
66 inline void init(){
67     scanf("%d%d",&m,&n); double t;
68     for(int i=0;i<maxn;i++)for(int j=0;j<maxn;j++) d[i][j]=INF;
69     for(int i=1;i<=m;i++) scanf("%lf%lf%lf",&a[i].x,&a[i].y,&t);
70     for(int i=1;i<=n;i++) scanf("%lf%lf%lf",&b[i].x,&b[i].y,&t);
71 }
72 int main(){
73     init();
74     solve();
75     return 0;
76 }
View Code

1027: [JSOI2007]合金

Time Limit: 4 Sec  Memory Limit: 162 MB
Submit: 3382  Solved: 955
[Submit][Status][Discuss]

Description

某公司加工一种由铁、铝、锡组成的合金。他们的工作很简单。首先进口一些铁铝锡合金原材料，不同种类的

Input

第一行两个整数m和n（m, n ≤ 500），分别表示原材料种数和用户需要的合金种数。第2到m + 1行，每行三

n + 1行，每行三个实数a, b, c（a, b, c ≥ 0 且 a + b + c = 1），分别表示铁铝锡在一种用户需要的合金中

Output

一个整数，表示最少需要的原材料种数。若无解，则输出–1。

10 10
0.1 0.2 0.7
0.2 0.3 0.5
0.3 0.4 0.3
0.4 0.5 0.1
0.5 0.1 0.4
0.6 0.2 0.2
0.7 0.3 0
0.8 0.1 0.1
0.9 0.1 0
1 0 0
0.1 0.2 0.7
0.2 0.3 0.5
0.3 0.4 0.3
0.4 0.5 0.1
0.5 0.1 0.4
0.6 0.2 0.2
0.7 0.3 0
0.8 0.1 0.1
0.9 0.1 0
1 0 0

5

Source

posted @ 2016-07-05 17:34  晴歌。  阅读(148)  评论(0编辑  收藏  举报