【CF1027C】Minimum Value Rectangle(贪心,数学)

题意:给定n根木棍,不允许拼接或折断,选择四根组成矩形,求所有合法矩形中周长平方与面积比最小的一个,输出拼成这个矩形的四根木棍

n<=1e6

思路:猜结论:答案必定从相邻的4根中产生

证明见https://www.luogu.org/blog/78371/so1ution-cf1027c

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<string>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<map>
 8 #include<set>
 9 #include<queue>
10 #include<vector>
11 using namespace std;
12 typedef long long ll;
13 typedef unsigned int uint;
14 typedef unsigned long long ull;
15 typedef pair<int,int> PII;
16 typedef vector<int> VI;
17 #define fi first
18 #define se second 
19 #define MP make_pair
20 #define N   1100000
21 #define MOD 1000000007
22 #define eps 1e-8 
23 #define pi acos(-1)
24 #define oo 110000000000000
25 
26 int a[N],b[N];
27 
28 
29 int read()
30 { 
31    int v=0,f=1;
32    char c=getchar();
33    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
34    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
35    return v*f;
36 }
37 
38 
39 void swap(int &x,int &y)
40 {
41     int t=x;x=y;y=t;
42 }
43 
44 
45 
46 int main()
47 {
48     //freopen("1.in","r",stdin);
49     //freopen("1.out","w",stdout);
50     int cas;
51     scanf("%d",&cas);
52     while(cas--)
53     {
54         int n;
55         scanf("%d",&n);
56         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
57         sort(a+1,a+n+1);
58         int m=0;
59         int i=0;
60         while(i<n)
61         {
62             i++;
63             if(i+1<=n&&a[i]==a[i+1]) {b[++m]=a[i]; i++;}
64         }
65         ll c=2*(b[2]+b[1]);
66         ll s=b[2]*b[1];
67         ll ans1=c;
68         ll ans2=s; 
69         int k=1;
70         for(int i=2;i<=m-1;i++)
71         {
72             c=2*(b[i]+b[i+1]);
73             s=b[i]*b[i+1];
74             if(s*ans1*ans1>ans2*c*c) {ans1=c; ans2=s; k=i;}
75         }
76         printf("%d %d %d %d\n",b[k],b[k],b[k+1],b[k+1]);
77     }     
78     return 0;
79 }

猜你喜欢

转载自www.cnblogs.com/myx12345/p/9843918.html