2026-01-27 hetao1733837 的刷题笔记

2026-01-27 hetao1733837 的刷题笔记

LGP3045 [USACO12FEB] Cow Coupons G

原题链接:[USACO12FEB] Cow Coupons G

分析

其实吧,这个可以拿背包做,但是 M ≤ 10 14 M\le 10^{14} M≤1014 显然不行,充分理解了 fqh 所说的 dp 实现复杂度不行的论断。思考一下,模一下样例......哦,注意是价格降为 C i C_i Ci。思考一下......难道说......那么简单吗?按照什么贪心?思考一下......NOIP2025 T1 算反悔吗?要是算的话......那紫也不能和黄比呀?难道说?我先按照差去贪一遍,然后再按照......反一下?神秘......unk ......看到了一个并行的东西......就是因为 C i ≤ P i C_i\le P_i Ci≤Pi,所以,我们在一些情况下是尽可能把优惠券用完的,所以,很微妙啊......怎么贪呢?开两个 priority_queue 再开一个 vis,差不多就这?看看题解......

这么纯粹?直接算贡献?就是先贪使用优惠卷,然后每个物品再反悔一次,没了......就这?!

正解

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 50005;
int n, k, m, p[N], c[N];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pr, cr;
priority_queue<int, vector<int>, greater<int>> d;
bool vis[N];
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> k >> m;
	for (int i = 1; i <= n; i++){
		cin >> p[i] >> c[i];
		pr.push({p[i], i});
		cr.push({c[i], i});
	}
	for (int i = 1; i <= k; i++){
		d.push(0);
	}
	int ans = 0;
	while (!pr.empty()){
		auto tmp1 = pr.top(), tmp2 = cr.top();
		if (vis[tmp1.second]){
			pr.pop();
			continue;
		}
		if (vis[tmp2.second]){
			cr.pop();
			continue;
		}
		if (d.top() > tmp1.first - tmp2.first){
			m -= tmp1.first;
			pr.pop();
			vis[tmp1.second] = true;
		}
		else{
			m -= tmp2.first + d.top();
			d.pop();
			cr.pop();
			vis[tmp2.second] = true;
			d.push(p[tmp2.second] - c[tmp2.second]);
		}
		if (m >= 0)
			ans++;
		else
			break;
	}
	cout << ans;
}

一些小细节还是自己想一下为好吧......

LGP9749 [CSP-J 2023] 公路

原题链接:[CSP-J 2023] 公路

分析

切不了橙......理论上......为啥我想到了单调栈?思考一下......好的,那么,既然你每次找后面小的,为啥不在前面经过的找最大的?这不就结了?

正解

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100005;
int n, d, v[N], a[N];
signed main(){
    // freopen("road.in", "r", stdin);
    // freopen("road.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> d;
    for (int i = 1; i < n; i++){
        cin >> v[i];
    }
    for (int i = 1; i <= n; i++){
        cin >> a[i];
    }
    int ans = 0, mn = 0x3f3f3f3f; 
    int dis = 0;
    for (int i = 1; i < n; i++){
        dis += v[i];  
        mn = min(mn, a[i]);
        if (dis > 0){ 
            int tmp = (dis + d - 1) / d;
            ans += tmp * mn; 
            dis -= tmp * d; 
        }
    }
    cout << ans;
}

LGP3093 [USACO13DEC] Milk Scheduling S

原题链接:[USACO13DEC] Milk Scheduling S

分析

真的吗?🤔按照时间贪一下?那反悔在哪?对于一个时间点,我似乎只能贪一个吧......

就这?那我辛苦写的优先队列 WA 了算什么/ll

正解

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 10005;
int n;
struct node{
	int d, g;
}a[N];
bool cmp(node x, node y){
	return x.g > y.g;
}
bool vis[N];
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++){
		cin >> a[i].g >> a[i].d;
	}
	sort(a + 1, a + n + 1, cmp);
	long long ans = 0;
	for (int i = 1; i <= n; i++){
		for (int j = a[i].d; j >= 1; j--){
			if (!vis[j]){
				vis[j] = true;
				ans += a[i].g;
				break;
			}
		}
	}
	cout << ans;
}

LGP1163 银行贷款

原题链接:银行贷款

分析

没啥可说的,我以前汤包了。得出公式
a n s = w m w 0 m − 1 − 1 ans=\sqrt[m-1]{\frac{wm}{w_0}}-1 ans=m−1w0wm −1

然后那个 ... m − 1 \sqrt[m-1]{\dots} m−1... 可以直接 pow(···,1.0/(m-1.0)),打一下。

算了,老老实实写实数二分吧。

正解

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-5;
double w0, w, m;
bool check(double x){
    if (pow(1.0 / (1.0 + x), m) >= 1 - w0 / w * x)
        return true;
    return false;
}
signed main(){
    cin >> w0 >> w >> m;
    double l = 0.0, r = 5.0;
    while (r - l >= eps){
        double mid = (l + r) / 2.0;
        if (check(mid))
            r = mid;
        else
            l = mid;
    }
    cout << fixed << setprecision(1) << l * 100.0;
}

浦东启动吧......没错,似乎有半周了,我还没有走出原生动物......所以,竞赛门槛哪有什么高低之分?都是时间、努力、天分、运气的积淀。
lz 不让我用他的充电线给台灯充电,是害怕我把台灯当成充电宝给别的东西充电吗?我似乎也没啥了......早知道上午充了......

嘻嘻,岁岁大好入,借到了......誓死追随岁岁!

LGP3537 [POI 2012] SZA-Cloakroom

原题链接:[POI 2012] SZA-Cloakroom

分析

?这不是个线段覆盖问题吗? n ≤ 1000 n\le1000 n≤1000 很微妙啊......似乎可以做类似 d p i , j dp_{i,j} dpi,j 表示 [ i , j ] [i,j] [i,j] 这段时间的最大价值。 q ≤ 10 6 q\le10^6 q≤106 就差不多要 O ( 1 ) O(1) O(1) 了。好像是对的......就是要求中间没人而且这个可以达到他的要求。我是这么理解的。思考一下......怎么做这个转移?如果说中间有点,那炸了,我们可以整一个 − ∞ -\infty −∞,对于那些单点和没有起始节点或者结束节点的段......思考一下怎么更新......而且要控制到 O ( n 2 ) O(n^2) O(n2),思考一下......咋还要求恰好为 k i k_i ki......难道说再记录一维?那铁定炸啊......理论上确实是预处理之后 O ( 1 ) O(1) O(1) 回答啊?还是看题解吧......还是背包 !可以做离线 ,我是🍬......我们设 f i f_i fi 表示取价值为 i i i 的物品截止时间的最小值的最大值......可以理解为一个瓶颈吧......总之就是这个东西。代码比较清新。

正解

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1005, M = 100005, K = 1000005;
struct node1{
    int c, a, b; 
} inp[N];
bool cmp1(node1 x, node1 y){
    return x.a < y.a;
}
struct node2{
    int m, k, s, id; 
}que[K];
bool cmp2(node2 x, node2 y){
    return x.m < y.m;
}
int f[M];
bool ans[K];
int n, p;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++){
        cin >> inp[i].c >> inp[i].a >> inp[i].b;
    }
    sort(inp + 1, inp + n + 1, cmp1);
    cin >> p;
    for (int i = 1; i <= p; i++){
        cin >> que[i].m >> que[i].k >> que[i].s;
        que[i].id = i;
    }
    sort(que + 1, que + p + 1, cmp2);
    f[0] = 0x7f7f7f7f;
    int j = 1;
    for (int i = 1; i <= p; i++){
        while (j <= n && inp[j].a <= que[i].m){
            for (int k = M - 1; k >= inp[j].c; k--){
                f[k] = max(f[k], min(f[k - inp[j].c], inp[j].b));
            }
            j++;
        }
        if (f[que[i].k] > que[i].m + que[i].s){
            ans[que[i].id] = true;
        }
    }
    for (int i = 1; i <= p; i++){
        if (ans[i])
            cout << "TAK" << '\n';
        else
            cout << "NIE" << '\n';
    }
}

洛谷评测机有点坑啊,很多 RE 都给报的 WA ......
aoao 提醒我该练代码能力了,启动!

相关推荐
端平入洛10 小时前
delete又未完全delete
c++
颜酱11 小时前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub15 小时前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub15 小时前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub15 小时前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub15 小时前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub15 小时前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
NAGNIP1 天前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
NAGNIP1 天前
一文搞懂激活函数!
算法·面试
董董灿是个攻城狮1 天前
AI 视觉连载7:传统 CV 之高斯滤波实战
算法