zoukankan      html  css  js  c++  java
  • 【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
    ",b[k],b[k],b[k+1],b[k+1]);
    77     }     
    78     return 0;
    79 }
  • 相关阅读:
    【字符串/广搜】P1032 字串变换
    【动态规划】P1541 乌龟棋
    【动态规划/递归】(团队内部比赛试题)T134293 T2.货币系统问题
    Redis-事务
    Redis-Pipeline
    Redis-通过前缀获取所有key
    Spring 三级缓存
    TopK_LRU_归并

    如何从一亿个数组里找出最大的十个
  • 原文地址:https://www.cnblogs.com/myx12345/p/9843918.html
Copyright © 2011-2022 走看看