NOIP2020.9.19模拟spongebob

本文介绍了一道NOIP2020模拟赛的算法题目,旨在求解给定安保任务参数下的最低薪水值。通过分析绝对值函数特性,采用零点分段方法,最终实现了高效求解。

NOIP2020.9.19模拟spongebob

Description

在这里插入图片描述

Input

输入文件包含 n + 1 行。
第一行一个整数 n,表示咸鱼 A 在这个月参加安保任务的次数。
接下来 n 行,每行两个整数 ai ,bi ,分别为这一次安保任务的两个参数。

Output

输出一行一个实数 y,表示在所有情况下薪水的最低值。
随后系统会将你的输出与答案进行比较,只有当你的输出与答案绝对误差不超过 10^−3 时才能得到

Sample Input

2
1 1
2 -1

Sample Output

1.50

Data Constraint

在这里插入图片描述

Hint

在这里插入图片描述

题解

题意

求min(sigma(|ai*x + bi|))

分析

显然是零点分段,零点的坐标为-a/b,选取的x一定为某个零点,那么每计算一次x的时间是O(n)的。考虑把绝对值拆掉,发现一个ax+b的函数跨过零点就要变号,且a’x+b’为单调函数,可以知道整个函数的解析式。

code

#include<cstdio>
#include<algorithm>
#define abs(x) (x>0?x:-(x))
#define min(x,y) (x<y?x:y)
#define N 300005
int a[N],b[N],p[N],n,suma;
double c[N],sum,ans=1e10;
using namespace std;
bool cmp(int x,int y) {return c[x]<c[y];}
int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;++i) scanf("%d%d",&a[i],&b[i]),c[p[i]=i]=-1.0*b[i]/a[i];
	sort(p+1,p+n+1,cmp);
	for (int i=1;i<=n;++i) sum+=abs(a[i]*c[p[1]]+b[i]),suma-=abs(a[i]);
	ans=sum;
	for (int i=2;i<=n;++i){
		suma+=abs(2*a[p[i-1]]);
		sum+=suma*(c[p[i]]-c[p[i-1]]);
		ans=min(ans,sum);
	}
	printf("%.6f",ans);
}
好的,我可以为您介绍一下2024年绍兴小学NOIP3的"装扮"题目的C++代码思路。这是一道经典的动态规划题目,需要考虑不同条件下的最优解。 以下是一个可能的C++代码框架: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; const int MAX_N = 1005; const int INF = 1e9; int n, m; int dp[MAX_N][MAX_N]; vector<int> clothes[MAX_N]; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { int k; cin >> k; clothes[i].resize(k); for (int j = 0; j < k; j++) { cin >> clothes[i][j]; } } for (int i = 0; i <= n; i++) { for (int j = 0; j <= m; j++) { dp[i][j] = INF; } } dp[0][0] = 0; for (int i = 1; i <= n; i++) { for (int j = 0; j <= m; j++) { dp[i][j] = dp[i-1][j]; for (auto &c : clothes[i]) { if (j >= c) { dp[i][j] = min(dp[i][j], dp[i-1][j-c] + 1); } } } } int result = INF; for (int j = 0; j <= m; j++) { result = min(result, dp[n][j]); } if (result == INF) { cout << -1 << endl; } else { cout << result << endl; } return 0; } ``` 这段代码的思路如下: 1. 使用二维数组 `dp[i][j]` 表示前i套衣服,花费j元时的最少换衣次数。 2. 初始化 `dp[0][0] = 0`,表示不穿衣服也不花钱的情况下,换衣次数为0。 3. 遍历每一套衣服,对于每套衣服的每个价格,更新 `dp` 数组。 4. 最后遍历 `dp[n][j]` (1 <= j <= m),找出最小的换衣次数。 5. 如果结果仍然是INF,说明无法满足条件,输出-1;否则输出结果。 这个解法的时间复杂度是 O(n*m*k),其中k是每套衣服的平均数量。空间复杂度是 O(n*m)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值