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

牛客练习赛6

时间:2017-11-18 16:02:26      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:clu   bit   一元二次方程求解   pen   stdin   main   二次   tin   max   

A题:

方法一:一元二次方程求解,但是会有精度误差,+1个点特判一下。

技术分享图片
#include <bits/stdc++.h>
 
using namespace std;
 
typedef unsigned long long ll;
 
ll t;
ll x,y,z;
 
int main()
{
    //freopen("in.txt","r",stdin);
    ll n;
    scanf("%lld%lld",&n,&t);
 
    ll ans = 0;
    for(ll i = 1; i <= n; i++) {
        scanf("%lld%lld%lld",&x,&y,&z);
        ll cnt;
        if(y==0&&z==0) continue;
        if(z==0) cnt = t/(x+y);
        else if(z!=0) {
            ll sq = ((x+y)-z/2)*((x+y)-z/2) + 2*z*t;
            sq = sqrt(sq) + z/2 - (x+y);
            cnt = (sq/z);
        }
         
        if((cnt+1)*(x+y)+(cnt+1)*cnt/2*z<=t)
            cnt++;
         
        ll tmp = cnt*(x+y) + cnt*(cnt-1)/2*z;
        if(t-tmp>=x) {
            ans += (t-(cnt+1)*x);
        }
        else {
            ans +=(t-cnt*x-(t-tmp));
        }
 
    }
    cout<<ans<<endl;
 
    return 0;
}
View Code

方法二:二分

二分是很坑的,二分上界是2e9,中间结果爆数据类型。大佬的解法是处理一下mid,2e9 >= (mid-1)*mid/2*z,移项一下。

技术分享图片
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll n,t,ans,res;
ll x,y,z;

int main()
{
    scanf("%lld%lld",&n,&t);
    for(ll i = 1ll; i <= n; i++) {
        scanf("%lld%lld%lld",&x,&y,&z);

        ll l = 1,r= 2000000000;
        ans = 0;
        while(l<=r) {
            ll mid = (l+r)>>1;
            if(2000000000/mid>=(mid-1)*z/2&&(1ll*(x+y)*mid+1ll*(mid-1)*mid/2*z)<=t)
            {
                l = mid+1;
                ans = mid;
            }
            else r = mid - 1;
        }

        ll tmp = (1ll*(x+y)*ans+1ll*(ans-1)*ans/2*z);
        ll tt = 0;
        tt += tmp - 1ll*ans*x;
        if(x<t-tmp) tt+=t-tmp-x;
        res+=tt;

    }

    printf("%lld\n",res);

    return 0;
}
View Code

 

 

D题:

当时脑子短路,不知道为什么要二分t,然后b全部都减t,处理a变与不变。当然感觉也是可以的,但是硬是90%。无语了~~~

看了题解,简直吐血~

贪心,先把a给变了,然后对应的max(0,b[i]-a[i]);

看来以后得大胆的贪心~~~

技术分享图片
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
 
const int MAXN = 200005;
ll a[MAXN],b[MAXN];
 
int main()
{
    int n,x;
    ll y;
    cin>>n>>x>>y;
 
    for(int i = 0; i < n; i++) scanf("%lld",&a[i]);
    for(int i = 0; i < n; i++) scanf("%lld",&b[i]);
 
 
    sort(a,a+n);
    sort(b,b+n);
 
 
    for(int i = 0; i < x; i++) if(a[i]<y) a[i] = y;
 
    sort(a,a+n);
 
    ll ans = 0;
    for(int i = 0; i < n; i++) {
        ans = max(ans,b[i]-a[i]);
    }
 
    printf("%lld\n",ans);
 
 
 
    return 0;
}
View Code

 

牛客练习赛6

标签:clu   bit   一元二次方程求解   pen   stdin   main   二次   tin   max   

原文地址:http://www.cnblogs.com/TreeDream/p/7856783.html

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