洛谷 B4071 [GESP202412 五級] 武器強化


思考難度低,但是代碼難度相對較高的題,故做個記錄。

首先,題目說了要花費最少的錢,所以我們每次拿最便宜的材料給武器1

思想:每次都拿最便宜的材料

然后考慮一下這個思想是否正確,找一下反例,每次拿一個材料給武器1,可以讓他增加一個。

那很明顯,如果我們除了武器1之外的,最多的那個材料,不管他的價格是多少,拿掉他,給武器1,相當于直接讓武器增加了2個材料(此消彼長)

所以有沒有一種可能,拿兩次最便宜的材料,不如拿一個材料種類最多的武器?

可以舉出一個反例:3 3/ 4,3+3塊錢貢獻了2個,4塊錢也貢獻了2個,顯然我們的核心思想需要改變。

改進思想:每次都拿最便宜的材料

1、如果此材料在 武器.材料種類 最多的武器上,直接執行

最便宜的1次操作實現了2次貢獻,很顯然已經沒有收益更高的操作了,這一步沒問題

2、如果此材料不在 武器.材料種類 最多的武器上;考慮對比 武器.材料種類 最多的武器

前者操作:令最便宜的花費為 cheapst,對武器1的貢獻 是1,每單位貢獻花費cheapst

后者操作:設花費為k(武器.材料種類 最多的武器可能有多個,所以這一步也要拿這些武器中最便宜的材料),對武器1的貢獻 是2,每單位貢獻花費 k/2

所以需要對比這兩者哪個更加劃算,由于k/2可能需要浮點數很麻煩,對比的時候直接把cheapst*2就可以。

顯然,已經找不出來更劃算的操作了,易得這一步也是沒問題的。

根據思想來實現全部功能,思想其實很容易定下來,但是這代碼就相當難寫了,AC代碼如下所示。

#include <bits/stdc++.h>
#define int long long
#define per(i,j,k) for(int (i)=(j);(i)<=(k);++(i))
#define rep(i,j,k) for(int (i)=(j);(i)>=(k);--(i))
#define fr first
#define se second
#define endl '\n'
using namespace std;const int N=1006;int n,m,ans;
int p[N],c[N];struct Material {int idx;int adapt;int cost;
}mat[N];
struct matCMP{bool operator()(Material a,Material b) {if (a.cost==b.cost) {return a.idx<b.idx;}return a.cost<b.cost;}
};
struct Weapon{int idx;set<Material,matCMP>mat;
}wea[N];//返回 武器.材料種類最多的 所有武器(除了武器1)
vector<Weapon>f() {int cnt=0;per(i,2,n) {cnt=max(cnt,(int)wea[i].mat.size());}vector<Weapon>res;per(i,2,n) {if (wea[i].mat.size()==cnt) {res.push_back(wea[i]);}}return res;
}
//返回最便宜的材料價格(除了武器1)
int g() {int res=INT_MAX;per(i,2,n) {if (wea[i].mat.size()) {res=min(res,(*wea[i].mat.begin()).cost);}}return res;
}
bool act1() {//最便宜的材料在 武器.材料種類最多的 武器上//直接執行vector<Weapon>v=f();int cheapst=g();per(i,0,v.size()-1) {if (v[i].mat.size()) {int val=(*v[i].mat.begin()).cost;if (val==cheapst) {wea[1].mat.insert(*v[i].mat.begin());wea[v[i].idx].mat.erase(wea[v[i].idx].mat.begin());ans+=val;return true;}}}return false;
}
void act2() {//cheap得到1貢獻  ~  約等于 2*chep得到2貢獻//武器.材料種類最多的 武器上,k得到2貢獻int cheap=g()*2;vector<Weapon>v=f();bool flag=false;//不拿最便宜的更劃算int idx=-1;per(i,0,v.size()-1) {if (v[i].mat.size()) {if ((*v[i].mat.begin()).cost<cheap) {if (flag==false) {flag=true;idx=i;}else {if ((*v[i].mat.begin()).cost<(*v[idx].mat.begin()).cost)idx=i;}}}}if (flag) {//拿v[idx]的最便宜材料wea[1].mat.insert(*v[idx].mat.begin());wea[v[idx].idx].mat.erase(wea[v[idx].idx].mat.begin());ans+=(*v[idx].mat.begin()).cost;}else {//拿最便宜的材料cheap>>=1;ans+=cheap;per(i,2,n) {if (wea[i].mat.size()) {if ((*wea[i].mat.begin()).cost==cheap) {wea[1].mat.insert(*wea[i].mat.begin());wea[i].mat.erase(wea[i].mat.begin());break;}}}}
}void solve() {cin>>n>>m;per(i,1,n)wea[i].idx=i;per(i,1,m) {cin>>p[i]>>c[i];mat[i].idx=i;mat[i].adapt=p[i];mat[i].cost=c[i];wea[p[i]].mat.insert(mat[i]);}if (n==1) {cout<<0<<endl;return;}while (wea[1].mat.size()<=f()[0].mat.size()) {if (!act1())act2();}cout<<ans<<endl;
}signed main() {ios::sync_with_stdio(false), cin.tie(nullptr);int t = 1;while (t--)solve();return 0;
}

不僅如此,還有兩個注意點

1、因為n>=1,所以n=1的時候,不需要任何操作,直接輸出0

2、自定義容器排序,set里面,如果只用 a.cost<b.cost,那么set保持升序的時候a.cost==b.cost會被直接去重,需要讓他們cost相等時,按照永遠不會相等的值來排序,或者直接用multiset

個人認為,思維難度大概,代碼難度至少

觀察發現,數據范圍相當小,更進一步從貢獻角度考慮,每次操作,我們去計算材料對武器1的 每單位貢獻花費,枚舉所有材料就可以了,此時他就是一個完美的

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95756.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL工具30年演進史:從Oracle到Navicat、DBeaver,再到Web原生SQLynx

目錄 一、1990s&#xff1a;廠商自帶的數據庫工具時代 二、2000s&#xff1a;Navicat等商業數據庫管理工具崛起 三、2010s&#xff1a;DBeaver等開源SQL工具興起 四、2020s&#xff1a;SQLynx&#xff0c;Web原生數據庫管理工具 五、SQL工具30年時間線對比 六、總結&…

C語言制作掃雷游戲(拓展版賦源碼)

目錄 引言&#xff1a; 三個新功能實現 1.可以選擇難度或自定義 實現難點解析 代碼實現&#xff08;附源碼&#xff09; 掃雷.c game.h game.c 2.對選擇位置進行標記或取消標記 一.框架 我們先理一下思路 如何構造框架 二.取消標記函數 三.標記函數 四.加入清屏&#xff0c;進…

Python快速入門專業版(十):字符串特殊操作:去除空格、判斷類型與編碼轉換

目錄引1.去除空格&#xff1a;清理字符串的實用技巧1.1 三類去空格方法&#xff1a;strip()、lstrip()、rstrip()1.2 實戰案例&#xff1a;處理用戶輸入的空格問題2.判斷類型&#xff1a;驗證字符串內容的特性2.1 常用類型判斷方法2.2 實戰案例&#xff1a;驗證用戶輸入的合法性…

Gamma AI:AI演示文稿制作工具,高效解決PPT框架搭建難與排版耗時問題

你做 PPT 的時候是不是也常陷入 “兩難”&#xff1f;要么對著空白幻燈片發呆&#xff0c;不知道怎么搭框架 —— 比如要做 “產品季度迭代復盤”&#xff0c;既想放數據又想講問題&#xff0c;結果頁面堆得像亂燉&#xff1b;要么好不容易湊完內容&#xff0c;又花兩小時調排版…

【應用案例】AI 給醫用過濾器 “找茬”:3 大難點 + 全流程解決方案

【應用案例】AI 給醫用過濾器 “找茬”&#xff1a;3 大難點 全流程解決方案&#x1f3af;醫用過濾器進行醫療AI檢測&#x1f3af;先看痛點&#xff1a;醫用過濾器檢測難在哪&#xff1f;&#x1f3af;AI檢測方案&#xff1a;3步實現“零漏檢”1. 硬件定制&#xff1a;讓缺陷“…

【數據庫相關】TxSQL新增數據庫節點步驟

TxSQL新增數據庫節點步驟準備工作與注意事項具體操作步驟第 1 步&#xff1a;在主庫上創建復制專用賬號第 2 步&#xff1a;對主庫進行鎖表并獲取二進制日志坐標第 3 步&#xff1a;備份主庫數據并傳輸到新從庫第 4 步&#xff1a;主庫解鎖第 5 步&#xff1a;在新從庫服務器上…

Jmeter快速安裝配置全指南

1、JDK安裝(Java Development Kit) 1.1.JDK下載 JDK下載址&#xff1a; Java Downloads | Oracle &#xff08;jdk-8u211-windows-x64.exe&#xff09; Android 基于 Java 語言開發&#xff0c;所以必須安裝Java環境&#xff0c;Java 環境分JDK 和JRE &#xff0c;JDK提…

設計模式最佳實踐 - 模板模式 + 責任鏈模式

廢話不多說&#xff0c;直接切入正題&#xff0c;本篇要講的是 模板模式 責任鏈模式 實踐。該最佳實踐本身就是一種對 責任鏈模式的增強&#xff0c;模板模式通過 父類 強耦合&#xff0c;預定義好 責任鏈 next 方法 的前后一些切面行為&#xff0c;優雅簡潔。先上示例&#x…

Python快速入門專業版(十一):布爾值與None:Python中的“真假”與“空值”(附邏輯判斷案例)

目錄引言&#xff1a;為什么“真假”與“空值”是編程的核心邏輯1.布爾值&#xff08;bool&#xff09;&#xff1a;Python中的“真”與“假”1.1 布爾值的基礎特性1.2 布爾運算&#xff1a;and、or、not的邏輯規則代碼示例&#xff1a;基礎布爾運算進階特性&#xff1a;短路求…

C++學習知識小結

1. 什么是類&#xff1f;什么是對象&#xff1f;兩者之間什么關系&#xff1f; 類是一類事物的共同特征的抽象描述&#xff0c;它定義這類所有的屬性和方法 可以理解為模版類本身不占用空間&#xff0c;它只是一種定義&#xff0c;描述了對象一個是什么樣子、能做什么 對象是根…

9. Mono項目與Unity的關系

1.Mono項目簡介 2.Mono項目與Unity是如何結合的 3.從Mono到IL2CPP演變過程1.Mono項目簡介 1).定義Mono是一個自由、開源的項目, 由Xamarin現屬于微軟主導開發; 它的目標是創建一個一套兼容于微軟.NET Framework 的跨平臺工具2).核心功能a.C#編譯器能將你寫的C#代碼編譯成IL(中間…

谷歌Genie 3:讓你的照片變成可以玩的游戲世界

你是否曾凝視著一張完美的旅行照片&#xff0c;想象著如果能走進那個畫面&#xff0c;自由探索會是怎樣一種體驗&#xff1f;或者&#xff0c;你是否曾被一幅畫的奇幻氛圍所吸引&#xff0c;渴望能在那片色彩斑斕的世界里奔跑跳躍&#xff1f;過去&#xff0c;這只是白日夢。而…

Cursor 提示詞探索——如何打造真正懂自己的Agent

最近看到魚皮的Cursor提示詞分享&#xff08;微信公眾平臺)&#xff0c;剛好之前也在做Agent開發&#xff0c;跟提示詞打交道的多&#xff0c;也經常發現 ai 蠢蠢的&#xff0c;一點不會根據提示詞設計的來&#xff0c;按魚皮的分享研究了一下&#xff0c;寫了這篇博客。 Curs…

C++ 內存模型:用生活中的例子理解并發編程

C 內存模型&#xff1a;用生活中的例子理解并發編程 文章目錄C 內存模型&#xff1a;用生活中的例子理解并發編程引言&#xff1a;為什么需要內存模型&#xff1f;核心概念&#xff1a;改動序列原子類型&#xff1a;不可分割的操作內存次序&#xff1a;不同的同步級別1. 寬松次…

AI急速搭建網站:Gemini、Bolt或Jules、GitHub、Cloudflare Pages實戰全流程!

文章目錄AI急速搭建網站&#xff1a;Gemini、Bolt或Jules、GitHub、Cloudflare Pages實戰全流程&#xff01;&#x1f680; 極速建站新范式&#xff1a;Gemini、Bolt.new、GitHub & Cloudflare Pages 全流程實戰&#xff01;第一步&#xff1a;創意可視化與代碼生成 — Goo…

Qwen2.5-VL實現本地GPTQ量化

本文不生產技術,只做技術的搬運工!! 前言 公開的Qwen2.5-VL模型雖然功能非常強大,但有時面對專業垂直領域的問題往往會出現一些莫名其妙的回復,這時候大家一版選擇對模型進行微調,而微調后的模型如果直接部署則顯存開銷過大,這時就需要執行量化,下面將介紹執行本地GPT…

【Redis】常用數據結構之Hash篇:從常用命令到使用場景詳解

目錄 1.前言 插播一條消息~ 2.正文 2.1Hash與String對比 2.2常用命令 2.2.1HSET 2.2.2HGET 2.2.3HEXISTS 2.2.4HDEL 2.2.5HKEYS 2.2.6HVALS 2.2.7HGETALL 2.2.8HMGET 2.2.9HLEN 2.2.10HSETNX 2.2.11HINCRBY 2.2.12HINCRBYFLOAT 2.3內部編碼 2.3.1. ziplist&…

OSPF基礎部分知識點

OSPF基礎 前言 路由器 根據 路由表 轉發數據包&#xff0c;路由表項 可通過手動配置 和動態路由協議 生成。&#xff08;兩種生成方式&#xff09;靜態路由比動態路由使用更少的帶寬&#xff0c;并且不占用CPU資源來計算和分析路由更新。當網絡結構比較簡單時&#xff0c;只需配…

Flutter 真 3D 游戲引擎來了,flame_3d 了解一下

在剛剛結束的 FlutterNFriends 大會上&#xff0c;Flame 展示了它們關于 3D 游戲的支持&#xff1a;flame_3d &#xff0c;Flame 是一個以組件系統&#xff08;Flame Component System, FCS&#xff09;、游戲循環、碰撞檢測和輸入處理為核心的 Flutter 游戲框架&#xff0c;而…

無需公網IP,電腦隨時與異地飛牛同步互聯保持數據一致性

最近小白有這樣一個煩惱&#xff1a;隨身帶著的電腦每天都在更新內容&#xff0c;于是就會有很多很多的存稿。電腦的空間開始變得不夠用了。各式各樣的圖片、視頻、文稿等內容&#xff0c;如果要整理到飛牛NAS上&#xff0c;好像很麻煩&#xff0c;而且每次都是需要回到家里才能…