AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 更多
    • 题解
    • 分享
    • 商店
    • 问答
    • 吐槽
  • App
  • 登录/注册

20230319测试题目

作者: 作者的头像   eric_fyq ,  2023-03-19 17:36:59 ,  所有人可见 ,  阅读 39


1


F - L1-雇佣兵


知识点:模拟题

代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int M, n, x;

int main()
{
    cin >> M >> n >> x;
    int m = 0; //当前的体力
    for(int i = 1; i <= x; i ++)
    {
        m += n;
        if(m >= M){
            n += M / n;
            m = 0;
        }
        if(n > M) break;//每次恢复的体力值不能大于M
    }
    cout << n << endl;
    return 0;
}

M - L2-松江 1843 路


知识点:绝对值不等式应用,贪心

货仓选址的变形题,我们需抽象把每一个人看做一个房子,只不过这些房子可以重叠。按道理来说我们需要选取众多房子的中位数,但是如果把每个人看做一个数组元素进行排序,那必然会超时,所以我们需要对房子排序,看人数中位数在哪个房子里,把这个房子当成中点即可

代码:

#include<iostream>
#include<algorithm>
#include <cmath>

using namespace std;

typedef long long LL;

const int N = 1e5+10;

struct point{
    long pos;
    int sum;

    bool operator <(const point &P)const{
        return pos < P.pos;
    }
}s[N];

LL l, n;
int num;

int main()
{
    cin >> l >> n;
    for(int i = 1; i <= n; i ++)
    {
        scanf("%lld%d", &s[i].pos, &s[i].sum);
        num += s[i].sum;
    }

    sort(s + 1, s + 1 + n);

    //找到中位数
    int x = (num + 1) / 2;
    LL zhong;
    int b = 0;
    for(int i = 1; i <= n; i ++)
    {
        b += s[i].sum;
        if(b >= x) 
        {
            zhong = s[i].pos;
            break;
        }
    }
    LL res = 0;
    for(int i =  1; i <= n; i ++)
    {
        res += abs(s[i].pos - zhong) * s[i].sum;
    }
    cout << res << endl;
    return 0;
}

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息