题意:给定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 }