首页 > 其他分享 >洛谷P10387 [蓝桥杯 2024 省 A] 训练士兵

洛谷P10387 [蓝桥杯 2024 省 A] 训练士兵

时间:2024-10-11 12:32:29浏览次数:1  
标签:2024 P10387 int LL mid 蓝桥 ch soldiers include

洛谷P10387 [蓝桥杯 2024 省 A] 训练士兵

1.My solution

#include <stdio.h>

#include <algorithm>
#include <cmath>
#include <iostream>
#include <set>
#include <string>
#define For(i, j, n) for (int i = j; i <= n; ++i)

template <typename T>
inline T read() {
    T x = 0;
    int f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

typedef long long LL;

constexpr int N = 1e5 + 5;

struct Soldier {
    int p, c;
    Soldier(int p, int c) : p(p), c(c) {}
	Soldier() : p(0), c(0) {}
    bool operator<(const Soldier& other) const { return c < other.c; }
} soldiers[N];

int n;
LL S, sumofP[N], sumofPC[N];

std::set<int> setofC;

int find(int x) {
	int l = 1, r = n;
	while(l < r) {
		int mid = l + r >> 1;
		if(soldiers[mid].c < x)
			l = mid + 1;
		else 
			r = mid;
	}
	return l;
} // 第一个大于等于x的值的位置

LL sumFromVal(int val) {
	int pos = find(val);
	return (sumofPC[n] - sumofPC[pos - 1]) - (LL)val * (sumofP[n] - sumofP[pos - 1]);
}

int main() {
    n = read<int>();
    S = read<LL>();
    for (register int i = 1; i <= n; i++) {
        int p = read<int>(), c = read<int>();
        soldiers[i] = Soldier(p, c);
        setofC.insert(c);
    }
    std::sort(soldiers + 1, soldiers + n + 1);
    for (int i = 1; i <= n; i++) {
        sumofP[i] = sumofP[i - 1] + (LL)soldiers[i].p;
		sumofPC[i] = sumofPC[i - 1] + (LL)soldiers[i].c * (LL)soldiers[i].p;
    }
    LL ans = 1000000000000000000LL;
    for (auto val : setofC) {
		LL tmpAns = S * val + sumFromVal(val);
		ans = std::min(ans, tmpAns);
    }
	printf("%lld\n", ans);
    return 0;
}

因为集体训练和单独训练的转折点肯定是某一批士兵训练完了之后,所以可以用set把c存起来,然后遍历一遍

2. Best solution

注意到c的取值范围比较小,故可以直接用一个桶存起来,这样更快

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
LL n, s, p[N], c[N], cnt[N], Sum, now, ans;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> n >> s;
	for (int i = 1; i <= n; i++)
		cin >> p[i] >> c[i], cnt[c[i]] += p[i], now += p[i], Sum += p[i] * c[i];
	for (int i = 1; i <= 1e6; i++) {
		if (now < s)  break;
		ans += s;
		Sum -= now;
		now -= cnt[i];
	}
	cout << ans + Sum;
	return 0;
}

标签:2024,P10387,int,LL,mid,蓝桥,ch,soldiers,include
From: https://www.cnblogs.com/smartljy/p/18458130

相关文章

  • 20241011 模拟赛总结
    得分:100+100+0+2=202感觉还行了。T1单调队列优化DP,花了将近45min,最开始写了一个假的DP花了太多时间了。T2原本像写一个乱搞,没想到就直接过了?对于每一行的第一个位置,先求出以这个点为左上顶点的答案,然后向右推,动态维护这个正方形即可,赌的就是相邻格子的答案差不会太大,所......
  • 2024大模型AI方向怎么样了?是可以入坑的吗?
    前言随着人工智能技术的迅猛发展,特别是大型语言模型(LLMs)的兴起,AI大模型已经成为当今科技领域的热门话题。不论是对希望转型进入AI行业的职场人士,还是对未来充满憧憬的学生来说,掌握AI大模型的相关知识和技术都显得尤为重要。那么,在2024年,大模型AI方向的发展情况如何?现在是不......
  • 第一篇博客(2024级新生的简单自我介绍及学习编程经历)
    亲爱的读者: 大家好!先来谈谈我写这篇博客的目的吧,写这篇博客的目的便是:1.做一个自我介绍。2.讲一讲我了解编程学习以及大学的经历。3.谈谈我对于我自己编程学习的看法。(学习目标,学习方法,花费时间)4.锻炼我的写作能力。(1)首先,本人网名为“尘饰”,来自于江西某个大学的2024级新......
  • 2024/10/10 模拟赛总结
    \(0+45+20+25=90\),T1暴力写挂唐完了#A.植物收集显然催熟次数一定小于\(n\),否则不会更优。对于催熟次数\(k\)确定时,每个种子能形成的其他种子一定如下图:那么这就变成了一个滑动窗口板子。由于当催熟次数\(k\)递增时,催熟的价格线性递增,买种子的价格单调不增,且减量单调递......
  • DATAGERRY REST API身份验证绕过漏洞(CVE-2024-46627)
    0X01产品描述:        ‌DATAGERRY是一个灵活的开源CMDB和资产管理工具,它完全将数据模型的定义留给用户。‌用户只需在一个易于使用的webfrontend中定义自己的对象类型(如服务器、路由器、租赁线路、位置等)。通过DATAGERRY的导出API,存储在DATAGERRY中的CMDB对象可以轻......
  • 2024前端高频面试题之一
    1.从输入URL到页面显示发生了什么(1)缓存查询(查询优先级:浏览器缓存,系统缓存,路由器缓存)(2)DNS解析,把网址解析唯一IP【网址是为了方便记忆】(3)执行tcp三次握手,建立http链接(4)浏览器拿到返回的数据渲染页面【可能存在跨域问题】(5)断开tcp连接2.fetch和ajax的......
  • 2024-10-11 自定义渲染之arco-design-vue table的columns的title ==》使用DOM插入子元
    嗯...不知我没找到arco对应tabletitle的自定义渲染的正确方式 但我已经找了1个小时了,既然没找到就自己插入吧业务场景如下: 给表头插入一个必填的符号*,就这么简单的需求。代码如下:constelements:any=document.querySelectorAll('.arco-table-th-title');elements.f......
  • 【2024-10-10】以理考文
    20:00不要怕,无论什么困难的事,只要硬着头皮去做,就闯过去了。                                                 ——林海音公司在不久前提交了涉密资质认证的申请,我是小......
  • 20222322 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容1.1本周学习内容本周学习主要围绕缓冲区溢出漏洞(攻击)展开1.2实验内容简述“pwn1”是一个Linux可执行文件正常运行时会调用“foo”函数。“foo”函数的功能是对用户输入的字符串进行简单回显。此程序中还包含另一个代码片段“getShell”,具有返回一个可用Shell的......
  • 网络安全(黑客技术)2024年三个月自学手册
    ......