牛客练习赛6

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;
}

方法二:二分

二分是很坑的,二分上界是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;
}

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;
}

时间: 2024-11-02 14:00:09

牛客练习赛6的相关文章

牛客练习赛11 B trie树+拓扑判环 E 分治求平面最近点对

牛客练习赛11 B  假的字符串题意:给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个串可能成为字典序最小的串,并输出它们. tags:好题 对于一个字符串, 1]如有其它字符串是它的前缀,那肯定不可能.这个直接用字典树处理就可以. 2]但如果以这个字符串为最小,怎么判定其它字符串不会矛盾呢? 其实矛盾的情况详细一点说是: 比如要以  abcd 为最小, 但又有另一个字符串 aba ,这就矛盾了. 对这种情况,在跑字典树的时候,我们对有相同父亲结点的多个儿

牛客练习赛18

链接:https://www.nowcoder.com/acm/contest/110/A来源:牛客网 最大乘积 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 这题要你回答T个询问,给你一个正整数S,若有若干个正整数的和为S,则这若干的数的乘积最大是多少?请输出答案除以2000000000000000003(共有17 个零) 的余数. 举例来说,当 S = 5 时,若干个数的和为 5

转载:牛客练习赛17 c 规律题

转载:https://www.cnblogs.com/zzqc/p/8995135.html C.链接:https://www.nowcoder.com/acm/contest/109/C来源:牛客网 题目描述 给定长度为n的数组a,定义一次操作为:1. 算出长度为n的数组s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007:2. 执行a = s:现在问k次操作以后a长什么样. 输入描述: 第一行两个整数n,k(1 <= n <= 2000,

牛客练习赛7

退役不退坑,以后还是要每周打一场比赛,训练思维了. 看来是很久没敲竞赛代码了,很生疏了.其余几题明天再填~~~ 在Alice和Bob?前的是两个骰?,上?分别写了六个数字. Alice和Bob轮流丢掷骰?,Alice选择第?个骰?,?Bob选择第?个,如果 谁投掷出的数更?,谁就可以获胜. 现在给定这两个骰?上的6个数字,你需要回答是Alice获胜?率更?,还是 Bob获胜?率更?.(请注意获胜?率相同的情况) 输入描述: 第???个数T,表?数据个数.接下来的每?组数据?共有2?,每??有6个

牛客练习赛7E 珂朵莉的数列

题意:求所有子区间的逆序数对数之和 题解:线段树维护,对于每一对逆序数(l,r)属于l*(n-r+1)个区间,计算每一对对结果的贡献即可,可用树状数组维护,sum维护(n-r+1),按逆序数那样操作 这题最狗的地方是爆longlong,java又超时...,用了一个小技巧,避免爆longlong #include<bits/stdc++.h> #define fi first #define se second #define ll long long #define ull unsigned

牛客练习赛7 E 珂朵莉的数列(树状数组+爆long long解决方法)

https://www.nowcoder.com/acm/contest/38/E 题意: 思路: 树状数组维护.从大佬那里学习了如何处理爆long long的方法. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 typedef long long ll; 7 const int maxn =

牛客练习赛9 F - 珂朵莉的约数

题目描述 珂朵莉给你一个长为n的序列,有m次查询 每次查询给两个数l,r 设s为区间[l,r]内所有数的乘积 求s的约数个数mod 1000000007 输入描述: 第一行两个正整数n,m第二行一个长为n的序列之后m行每行两个数l和r 输出描述: 对于每个询问,输出一个整数表示答案 示例1 输入 5 5 64 2 18 9 100 1 5 2 4 2 3 1 4 3 4 输出 165 15 9 45 10 备注: 对于100%的数据,有n , m <= 100000 , a[i] <= 100

牛客练习赛10

A旅游观光 题目描述 有n个地方,编号为1->n,任意两个地方有公交车,从i到j的票价为(i+j)mod(n+1),而且这个票可以用无限次,你要把这些地方全部走一遍,问最小花费为多少.可以在任意地方开始和结束. 输入描述: 第一行一个数n 输出描述: 输出一行一个数表示答案 示例1 输入 10 输出 4 说明 1 -> 10 -> 2 -> 9 -> 3 -> 8 -> 4 -> 7 -> 5 -> 6,代价是4 备注: 对于100%的数据,有1

牛客练习赛1 补题记录

A 矩阵 中文题意,要找一个最大的k阶子矩阵在原矩阵中出现过两次. 需要将这个矩阵进行Hash,也就是需要二维Hash,先把每一行Hash了,再把每一列Hash了,有一点前缀的感觉. 预处理完Hash值之后,二分答案k,check过程是在$O(n ^ 2)$枚举起点,这里其实枚举终点方便一些,边界比较好处理,把每个k阶矩阵的hash值存下来,最后看有没有两个一样的. 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int