码迷,mamicode.com
首页 > 其他好文 > 详细

妈妈的考试

时间:2019-05-12 11:03:23      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:范围   ret   i++   hellip   顺序   continue   coder   targe   操作   

链接:https://ac.nowcoder.com/acm/contest/880/A

 初步判断w1与题目的对错顺序无关,而和题目的对错个数有关。于是计算(s1+s2+……+sn)后可以发现 s13+s23+……+sn是等于w0的,而各项平方之和是等于n的,同时存在6×w1,于是就可以得到w1=  (w03  + w0( 2 - 3n ) ) / 6,对右边求导得到3w0+( 2 - 3 * n ) ,于是求零点即可。对于第一问,列出不等式并根据同号得正的方法分类讨论一下,求出端点(三个),然后在+-5的范围内取符合条件的极值,但是需要注意取值必需与n同奇偶,并在-n与n之间。对于第二问把求导取得的零点中负的那个按+-5范围求值取符合条件的极值即可。+-5的操作是为了防止卡精度,然后注意一下开int128。各种小细节没注意让我WA了好几发。

#include<cstdio>
#include<algorithm>
#define rep(i,j,k) for(int i=j;i<=k;i++)
#include<cmath>
#include<cctype>
 
using namespace std;
typedef __int128 ll;
 
template <typename T> inline T in(T &x){
    char c11=getchar(),ob=0;x=0;
    while(c11^-&&!isdigit(c11))c11=getchar();if(c11==-)c11=getchar(),ob=1;
    while(isdigit(c11))x=x*10+c11-0,c11=getchar();if(ob)x=-x;return x;
}
 
ll sqrt(ll x)
{
    ll l=0,r=2000000000,mid;
    while(l!=r)
    {
        mid=((l+r)>>1)+1;
        if(ll(mid)*mid<=x) l=mid;
        else    r=mid-1;
    }
    return l;
}
 
ll g(ll w0,ll n){return (w0*w0*w0+w0*(2-3*n))/6;}
 
void out(ll xx){if(xx){out(xx/10);putchar(xx%10+0);}}
 
void kw0(ll n){
    ll a=sqrt(3*n-2);
    ll ans=9000000000000000000,tp;
    for(ll i=a-5;i<=a+5;i++){
        if(i>=-n&&i<=n&&(n-i)%2!=1){
            tp=g(i,n);
            if(tp<=0) continue;
            ans=min(ans,tp);
        }
    }
    a=-a;
    for(ll i=a-5;i<=a+5;i++){
        if(i>=-n&&i<=n&&(n-i)%2!=1){
            tp=g(i,n);
            if(tp<=0) continue;
            ans=min(ans,tp);
        }
    }
    a=0;
    for(ll i=a-5;i<=a+5;i++){
        if(i>=-n&&i<=n&&(n-i)%2!=1){
            tp=g(i,n);
            if(tp<=0) continue;
            ans=min(ans,tp);
        }
    }
    out(ans);
    printf(" ");
    return ;
}
 
void kw1(ll n){
    ll a=(n*3-2)/3,ans=-9000000000000000000;
    a=-sqrt(a);
    for(ll i=a-5;i<=a+5;i++){
        if(i>=-n&&i<0&&(n-i)%2==0){ 
            ans=max(ans,g(i,n));
        }
    }
    out(ans);
    return ;
}
 
int main(){
    int T;
    ll n;
    in(T);
    rep(i,1,T){
        in(n);
        kw0(n);
        kw1(n);
        putchar(10);
    }
    return 0;
}

 

妈妈的考试

标签:范围   ret   i++   hellip   顺序   continue   coder   targe   操作   

原文地址:https://www.cnblogs.com/ieqefcr/p/10851093.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!