当前位置: 首页 > news >正文

《P1194 买礼物》

题目描述

又到了一年一度的明明生日了,明明想要买 B 样东西,巧的是,这 B 样东西价格都是 A 元。

但是,商店老板说最近有促销活动,也就是:

如果你买了第 I 样东西,再买第 J 样,那么就可以只花 KI,J​ 元,更巧的是,KI,J​ 竟然等于 KJ,I​。

现在明明想知道,他最少要花多少钱。

输入格式

第一行两个整数,A,B。

接下来 B 行,每行 B 个数,第 I 行第 J 个为 KI,J​。

我们保证 KI,J​=KJ,I​ 并且 KI,I​=0。

特别的,如果 KI,J​=0,那么表示这两样东西之间不会导致优惠。

注意 KI,J​ 可能大于 A。

输出格式

一个整数,为最小要花的钱数。

输入输出样例

输入 #1复制

1 1
0

输出 #1复制

1

输入 #2复制

3 3
0 2 4
2 0 2
4 2 0

输出 #2复制

7

说明/提示

样例解释 2。

先买第 2 样东西,花费 3 元,接下来因为优惠,买 1,3 样都只要 2 元,共 7 元。

(同时满足多个“优惠”的时候,聪明的明明当然不会选择用 4 元买剩下那件,而选择用 2 元。)

数据规模

对于 30% 的数据,1≤B≤10。

对于 100% 的数据,1≤B≤500,0≤A,KI,J​≤1000。

2018.7.25新添数据一组

代码实现:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;

const int MAX_ITEMS = 501;  // 最大物品数量
const int INF = 0x7fffffff; // 表示无穷大

int discountMatrix[MAX_ITEMS][MAX_ITEMS]; // 物品间的优惠价格矩阵
int minDist[MAX_ITEMS];                  // 记录到最小生成树的最短距离
bool inMST[MAX_ITEMS];                   // 标记物品是否已加入最小生成树

int main()
{
// freopen("present.in","r",stdin);
int basePrice, itemCount;  // 基础价格和物品数量
cin >> basePrice >> itemCount;

// 读取优惠价格矩阵并进行初始化处理
for (int i = 1; i <= itemCount; i++) {
for (int j = 1; j <= itemCount; j++) {
cin >> discountMatrix[i][j];

// 自己到自己的价格设为无穷大(无意义)
if (i == j) {
discountMatrix[i][j] = INF;
continue;
}

// 如果没有优惠(K=0),则使用基础价格
if (discountMatrix[i][j] == 0) {
discountMatrix[i][j] = basePrice;
}

// 保证无向图的对称性
discountMatrix[j][i] = discountMatrix[i][j];
}
}

// 初始化距离数组
for (int i = 1; i <= itemCount; i++) {
minDist[i] = INF;
}
minDist[1] = 0;  // 从第一个物品开始

// Prim算法构建最小生成树
for (int i = 1; i <= itemCount; i++) {
// 找到距离当前生成树最近的物品
int currentMin = INF;
int selectedItem = -1;

for (int j = 1; j <= itemCount; j++) {
if (minDist[j] < currentMin && !inMST[j]) {
currentMin = minDist[j];
selectedItem = j;
}
}

// 将选中的物品加入生成树
inMST[selectedItem] = true;

// 更新其他物品到生成树的最短距离
for (int j = 1; j <= itemCount; j++) {
if (discountMatrix[selectedItem][j] < minDist[j] && !inMST[j]) {
minDist[j] = discountMatrix[selectedItem][j];
}
}
}

// 计算总花费:所有边的距离和加上第一个物品的基础价格
int totalCost = 0;
for (int i = 1; i <= itemCount; i++) {
totalCost += minDist[i];
}
totalCost += basePrice;

cout << totalCost << endl;

return 0;
}

http://www.lryc.cn/news/622518.html

相关文章:

  • 综合案例:Python 函数知识整合 — 学生成绩管理系统
  • 【秋招笔试】2025.08.15饿了么秋招机考-第三题
  • 无脑整合springboot2.7+nacos2.2.3+dubbo3.2.9实现远程调用及配置中心
  • hex文件结构速查
  • PyQt6实例_50个流通领域重要生产资料市场价格查看工具
  • OpenCV---getStructuringElement 结构元素获取
  • 铨林接纸机学习记录1
  • 嵌入式开发学习———Linux环境下网络编程学习(二)
  • STC8单片机驱动I2C屏幕:实现时间、日期与温湿度显示
  • AutoSar AP平台功能组并行运行原理
  • 码上爬第七题【协程+对抗格式化检测+数组移位】
  • 【Canvas与玻璃光】铝圈蓝底玻璃光按钮
  • 吉他和弦学习:从音程基石到流畅弹奏
  • 优先级反转问题
  • 在使用 scp 传输大文件时,为避免因连接超时导致传输中断
  • 领域防腐层(ACL)在遗留系统改造中的落地
  • python中的reduce函数
  • MSYS2+CMake配置C/C++开发环境
  • OpenSCA开源社区每日安全漏洞及投毒情报资讯|14th Aug. , 2025
  • plantsimulation中存储(store)、缓冲区(buffer)、放置缓冲区(PlaceBuffer)的区别,分别应用于那种情况
  • OpenCompass傻瓜式入门教程
  • linux-数据链路层
  • 博弈论06——PPAD复杂度问题
  • JAVA-DAY7-面向对象进阶
  • 从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.15
  • Java研学-SpringCloud(三)
  • Erlang notes[2]
  • Shortest Routes II(Floyd最短路)
  • 数据结构:二叉树的表示方式(Representation of Binary Trees)
  • 【100页PPT】数字化转型集团信息化总体解决方案(附下载方式)