zoukankan      html  css  js  c++  java
  • HDU-7106 (数学+思维)

    题目链接在这里:Problem - 7106 (hdu.edu.cn)

    这题是要求一个函数在一段区间上的极值,这是一个四次函数,通过因式分解并没有什么有价值的发现,但是我们发现,如果固定了一个变量,剩下的就是一个二次函数,显然二次函数求最值还是很好操作的,打表可以发现g(x)的最大值也只有54,所以我们可以枚举g(x)然后二分找极值,将极值和端点值中取一个最小值即可

    代码直接贴了队友的(zmhyyds

     1 #include<bits/stdc++.h>
     2 #include<cstdio>
     3 #include<vector>
     4 using namespace std;
     5 typedef long long LL;
     6 const int M=1e6+10;//54
     7 int T,g[M]; 
     8 LL A,B,C,D,N,ANS;
     9 vector<int>V[60];
    10 LL calc(LL a){
    11     return A*a*a*g[a]+B*a*a+C*a*g[a]*g[a]+D*a*g[a];
    12 }
    13 int main()
    14 {
    15     freopen("1.in","r",stdin);
    16     freopen("1.out","w",stdout);
    17     for(int i=1;i<=1e6;i++){
    18         int a=i;
    19         while(a){
    20             g[i]+=a%10;
    21             a=a/10;
    22         }
    23         V[g[i]].push_back(i);
    24     }
    25     for(int i=1;i<=54;i++){
    26         sort(V[i].begin(),V[i].end()); 
    27     }
    28     scanf("%d",&T);
    29     while(T--){
    30         scanf("%lld%lld%lld%lld%lld",&A,&B,&C,&D,&N);
    31         ANS=min(calc(1ll),calc(N));
    32         for(int i=1;i<=54;i++){
    33             LL lsa=A*i,lsb=B,lsc=C*i*i,lsd=D*i;
    34             LL lsx=(-lsc-lsd)/(2*lsa+2*lsb);
    35             LL L=0,R=V[i].size()-1;LL l=L,r=R;
    36             if(V[i][0]>N) continue;
    37             //然后找R;
    38             while(l<=r){
    39                 int mid=(l+r)>>1;
    40                 if(V[i][mid]<=N) {
    41                     R=mid;
    42                     l=mid+1;
    43                 }
    44                 else r=mid-1; 
    45             } 
    46             LL ls=-1;l=L,r=R;
    47             while(l<=r){
    48                 int mid=(l+r)>>1;
    49                 if(V[i][mid]<=lsx) {
    50                     ls=mid;
    51                     l=mid+1;
    52                 }
    53                 else r=mid-1; 
    54             }
    55             if(ls!=-1) {
    56                 ANS=min(ANS,calc(V[i][ls]));
    57             }
    58             ls=-1;l=L,r=R;
    59             while(l<=r){
    60                 int mid=(l+r)>>1;
    61                 if(V[i][mid]>=lsx) {
    62                     ls=mid;
    63                     r=mid-1; 
    64                 }
    65                 else l=mid+1;
    66             }
    67             if(ls!=-1) {
    68                 ANS=min(ANS,calc(V[i][ls]));
    69             }
    70         }
    71         printf("%lld
    ",ANS);
    72     }
    73     return 0;
    74 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/15201364.html
Copyright © 2011-2022 走看看