首页 > 其他分享 >洛谷题解-P1194 买礼物

洛谷题解-P1194 买礼物

时间:2024-02-03 20:11:40浏览次数:37  
标签:le 洛谷 题解 KI BBB JK P1194 222 礼物

https://www.luogu.com.cn/problem/P1194

题目描述

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

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

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

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

输入格式

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

接下来 BBB 行,每行 BBB 个数,第 III 行第 JJJ 个为 KI,JK_{I,J}KI,J​。

我们保证 KI,J=KJ,IK_{I,J}=K_{J,I}KI,J​=KJ,I​ 并且 KI,I=0K_{I,I}=0KI,I​=0。

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

注意 KI,JK_{I,J}KI,J​ 可能大于 AAA。

输出格式

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

输入输出样例

输入 #1
1 1
0

输出 #1
1
输入 #2
3 3
0 2 4
2 0 2
4 2 0
输出 #2
7

说明/提示

样例解释 222。

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

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

数据规模

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

对于 100%100\%100% 的数据,1≤B≤500,0≤A,KI,J≤10001\le B\le500,0\le A,K_{I,J}\le10001≤B≤500,0≤A,KI,J​≤1000。

2018.7.25新添数据一组

 

 

 

又是“最小”,可以考虑最小生成树

超级源点是0点向每个点连边,可以用在此题

(因为题目要求要买b件礼物,但是所有礼物都是通过一个礼物去买另外一个礼物,却不能买自身的这个礼物)

所以要能选到这个礼物,建一个点,但是总不可能礼物自己和自己连边,因为最小生成树肯定不会有自环

所以要考虑从0号点去选,通过0号店到这个点,就能选到这个礼物了

但是退出条件的n记得+1,因为总节点数+1了

#include <bits/stdc++.h>
using namespace std;

const int N=500005;
struct node
{
	int u, v, w;
}a[N];
int x, n, w1, dis[N], vis[N], ans=0, e=0, f[N], cnt=0;
bool cmp(node a, node b)
{
	return a.w<b.w;
}
int find(int x)
{
	if (f[x]==x) return x;
	return f[x]=find(f[x]);
}
void kru()
{
	sort(a+1, a+1+e, cmp);
	for (int i=1; i<=n; i++) f[i]=i;
	
	for (int i=1; i<=e; i++)
	{
		int u=a[i].u, v=a[i].v, w=a[i].w;
		int x=find(u), y=find(v);
		
		if (x!=y)
		{
			ans+=w;
			f[x]=y;
			cnt++;
		}
		if (cnt==n-1) return ;
	}
}
int main()
{
	scanf("%d%d", &x, &n);
	for (int i=1; i<=n; i++) //超级源点
	{
		a[++e]={0, i, x};
		a[++e]={i, 0, x};
	}
	for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=n; j++)
		{
			scanf("%d", &w1);
			if (i==j) continue;
			if (w1==0 || w1>x) w1=x;
			a[++e]={i, j, w1};
		}
	}
	n++; //总节点数+1
	kru();
	
	printf("%d", ans);
	return 0;
}

 

标签:le,洛谷,题解,KI,BBB,JK,P1194,222,礼物
From: https://www.cnblogs.com/didiao233/p/18005132

相关文章

  • [ABC279G] At Most 2 Colors 题解
    题目链接题目大意有一个\(1\timesN\)的格子和\(c\)种颜色,每个格子可以染上\(c\)种颜色中的一种。求任意相邻\(k\)个格子染色种类不超过\(2\)种的方案数。思路很明显,这是一个计数DP的题设\(f_i\)表示前\(i\)个格子染色的方案数,考虑第\(i\)个格子的染色情......
  • 0129-0203部分校赛题解复盘
    vj第一场A题https://codeforces.com/gym/103480/problem/A该题让我们可以从回文串的特点入手,即两个相同的字母便可增加长度2,所以并不用思考该回文串要如何排序出来,而是看有多少对相同的字母,使用map<char,int>来记录字母出现的次数,再计算可以除以2的次数即可。点击查看代码#i......
  • CF1454F Array Partition 题解
    题目链接:CF或者洛谷感觉很多人写太复杂了,其实感觉这题性质很好的。。询问是否可以分为三段\(max_1=min_2=max_3\)。考虑枚举\(max_1\),由于后缀\(max_3\)具有单调性,所以我们可以双指针轻松拿到这样一个模型:因为后缀\(max\)具有单调性,通过双指针我们可以拿到\(j\)后缀......
  • CF1789F Serval and Brain Power 题解
    题目链接点击打开链接题目解法好有技巧性的题(感觉\(n\le80\)这个数据范围就很奇怪啊)首先可以发现\(k\le3\)是好做的,只要枚举断点,然后\(dp\)做一遍\(lcs\)即可,时间复杂度为\(O(n^{2k+1})\),不过严重跑不满,所以可以跑\(k=4\)的情况和\(k=2\)的情况是相同的,所以不......
  • [ABC328G] Cut and Reorder 题解
    [ABC328G]CutandReorder题解状压fw实锤思路观察到排列操作只会做一次,答案的编号一定是一段一段的。所以可以考虑\(f_s\)表示前\(popcount(s)+1\)个\(a\)元素,放进\(b\)中\(s\)的最小代价转移可以考虑放置一段,每放一段需要\(c\)的代价。专业看起来复杂度非......
  • 【洛谷 P2249】【深基13.例1】查找(向量+二分查找+递归)
    【深基13.例1】查找题目描述输入个不超过的单调不减的(就是后面的数字不小于前面的数字)非负整数,然后进行次询问。对于每次询问,给出一个整数,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出。输入格式第一行个整数和,表示数字个数和询问次数。第二行......
  • 洛谷P5907 数列求和加强版 / SPOJ MOON4
    题面描述求\[\sum_{i=1}^ni^ka^i\]对\(998244353\)取模的结果。\(O(k)\)做法为了推导方便,下令\(p=a^{-1}\)。即求\[\sum_{i=1}^n\frac{i^k}{p^i}\]我们裂项,即尝试寻找多项式\(f(x)\),使得\[\frac{x^k}{p^x}=\frac{f(x)}{p^{x-1}}-\frac{f(x+1)}{p^x}\]即\[x^k......
  • U404643 帕鲁大陆染色的一天 题解
    题目链接:帕鲁大陆染色的一天注意到每种颜色是独立的,所以我们能够比较容易地得知每种颜色在一系列操作中的出现和消失时间。我们注意到每个操作加入以后会有两个影响,对它后面的操作显然颜色总数都会\(+1\),对前面操作的影响来说,显然会覆盖掉某些颜色,导致某些颜色消失,换句话来讲消......
  • P2178 [NOI2015] 品酒大会 题解
    P2178[NOI2015]品酒大会题解纪念一下第一道完全自己想出来的紫NOI题。思路由于r相似有单调性的性质,题目中也提示了这一点,考虑按\(height_i\)从大到小把所有相邻的\(sa\)数组内两个后缀合并,用并查集维护,发现第一问的答案就是\[\sum_{i是并查集的根}\binom{size_i}{2}......
  • P10118 『STA - R4』And 题解
    题目看到位运算,直接二进制拆分考虑。首先\(x\operatorname{AND}y=B\),设\(x=B+m\),\(y=B+n\),知道\(x+y=A\),所以设\(W=n+m=A-2\timesB\),\(y-x\)等价于\(n-m\)。因为已知\(x\operatorname{AND}y=B\),所以\(n\operatorname{AND}m=0\),着意味着在二进制下\(n\)和\(m\)不......