周六题目前四题详解

时间:2020-04-25
本文章向大家介绍周六题目前四题详解,主要包括周六题目前四题详解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

B题题目是CodeForces - 1009C Annoying Present

是一开始给我们一个长度为n的全0的数组,然后给我们m次变化,每次变化中给我们一个xi和di,每次的操作是,数组上每个数字都加上xi然后再加上di乘以dist| i - j |,

因为每个数字都要处理,所以我们可以直接处理整个数组,不管d是什么值,我们首先每次sum都是要加上xi*n的,接着关于d,如果他是正数的话,相当于每个数都加上

一个正数,那我们要保证它最大,我们就从第一位开始加就是d乘以0+1+2+.....+(n-1)所以就是d乘以n*(n-1)/ 2;如果他是负数,那我们就选择放在中间,这样数字就会尽可能小,

然后判断一下奇数还是偶数就好了,如果是奇数,我们假设是5 就是2+1+0+1+2,相当于(n+1)/2*(n-1)/2,如果是偶数,假设是6,就是2+1+0+1+2+3,相当于n*n/4;

这就是我们本题的解法了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 110000
using namespace std;
#define ll long long 
int gi() {
    int x = 0; char c = getchar();
    while (c < '0' || c > '9') c = getchar();
    while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x;
}
#define mod 998244353
//123****123

int main()
{
    ll n, m;
    cin >> n >> m;
    ll sum = 0;
    while (m--)
    {
        ll x, d;
        cin >> x >> d;
        
        if (d > 0)
        {
            sum += x * n + (n - 1) * n / 2 * d;
        }
        else
        {
            if (n % 2 == 1)
            {
                sum += x * n + (n + 1) / 2 * (n - 1) / 2*d;
            }
            else
            {
                sum += x * n + n * n / 4*d;
            }
        }
        
    }
    printf("%.13f\n", (double)sum/n);
}

C题题目是 CodeForces - 965C Greedy Arkady

题目意思是给我们n个糖果,k个人,让我们选择一个x,每次分配x个糖果给每个人,要使第一个拿糖果的人,能够拿到最多的糖果(对于他而言),x有上限M,同时

分配的次数也有限制不能多于D次。

思路:我的想法是每次分配x个糖果,那么相当于我们可以分配m圈,我们只要保证第一个人拿到的数量是m+1圈就可以找一个最大值,保证他的数量最大了,那我们就每次

遍历圈数,看看能不能满足条件,然后取最大值,然后本题有一个坑点,如果你是每次遍历的话,会wa18组,因为他给我们的测试样例为

1000000000000000000 1000000000000000000 1000 1000
然后我们就会出现后面n/(k*(m)+1)的结果为正,所以就会出现错误,这里我们加一个判断,如果结果为0了,后面就不用判断了就结束了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 110000
using namespace std;
#define ll long long 
int gi() {
    int x = 0; char c = getchar();
    while (c < '0' || c > '9') c = getchar();
    while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x;
}
#define mod 998244353
//123****123

int main()
{
    ll n, k, m, d;
    cin >> n >> k >> m >> d;
    ll maxx = 0;
    //cout << n / (k * 19 + 1) << endl;
    for (ll i = 1; i <= d; i++)
    {
        
        ll x = (n) / ( (i - 1)*k + 1);
        if (x == 0)break;
        //cout << x << endl;
        if (x > m)
        {
            x = m;
        }
        //cout << maxx << endl;
        maxx = max(maxx, x * i);
    }
    cout << maxx << endl;
}
 

原文地址:https://www.cnblogs.com/csxaxx/p/12772748.html