20230319测试题目
作者:
eric_fyq
,
2023-03-19 17:36:59
,
所有人可见
,
阅读 39
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;
}