Luogu 1194买礼物

题意:买n个东西,这些东西有个原价m,若买东西i,则东西j降到a[i][j]元,求买n个东西最少的钱.

做法:若买i后买j的价钱a[i][j]比m小,那么连一条无向边,跑一波最小生成树.

看剩下还有几个点没连进去的就直接按原价买..

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <queue>
 7 #include <stack>
 8 #include <map>
 9 #define ll long long
10 #define out(a) printf("%d",a)
11 #define ln printf("\n")
12 const int N=3e5+50050;
13 const int MOD=1e9+7;
14 using namespace std;
15 int n,m,x;
16 int tot=0,ans=0,cnt=0;
17 int pre[N];
18 struct node
19 {
20     int x,y,cost;
21 }a[N];
22 int read()
23 {
24     int s=0,t=1; char c;
25     while (c<‘0‘||c>‘9‘){if (c==‘-‘) t=-1; c=getchar();}
26     while (c>=‘0‘&&c<=‘9‘){s=s*10+c-‘0‘; c=getchar();}
27     return s*t;
28 }
29 ll readl()
30 {
31     ll s=0,t=1; char c;
32     while (c<‘0‘||c>‘9‘){if (c==‘-‘) t=-1; c=getchar();}
33     while (c>=‘0‘&&c<=‘9‘){s=s*10+c-‘0‘; c=getchar();}
34     return s*t;
35 }
36 bool cmp(node a,node b)
37 {
38     return a.cost<b.cost;
39 }
40 int find(int x)
41 {
42     if (pre[x]==x) return x;
43     else return pre[x]=find(pre[x]);
44 }
45 void Kruskal()
46 {
47     for (int i=1;i<=tot;i++){
48       int x=find(a[i].x),y=find(a[i].y);
49       if (x!=y){
50         ans+=a[i].cost;
51         pre[x]=y; cnt++;
52       }
53       if (cnt==n-1) return;
54     }
55 }
56 int main()
57 {
58     m=read(),n=read();
59     for (int i=1;i<=n;i++){
60       pre[i]=i;
61       for (int j=1;j<=n;j++){
62         x=read();
63         if (x!=0&&x<m) a[++tot].x=i,a[tot].y=j,a[tot].cost=x;
64       }
65     }
66     sort(a+1,a+tot+1,cmp);
67     Kruskal();
68     ans+=(n-cnt)*m;
69     out(ans);
70     return 0;
71 }

原文地址:https://www.cnblogs.com/Kaleidoscope233/p/9807293.html

时间: 2024-11-20 20:35:10

Luogu 1194买礼物的相关文章

luogu P1194 买礼物

题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第I样东西,再买第J样,那么就可以只花K[I,J]元,更巧的是,K[I,J]竟然等于K[J,I]. 现在明明想知道,他最少要花多少钱. 输入输出格式 输入格式: 第一行两个整数,A,B. 接下来B行,每行B个数,第I行第J个为K[I,J]. 我们保证K[I,J]=K[J,I]并且K[I,I]=0. 特别的,如果K[I,J]=0,那么表示这两样东西之间不会

2017广东工业大学程序设计竞赛决赛-tmk买礼物

tmk买礼物 Description 今天是校赛的日子,为了庆祝这么喜庆的日子,TMK打算买些礼物给女票LSH庆祝一下. TMK进入了雪梨超市,然后刚踏入的一瞬间,店主就对TMK说:“恭喜你成为了本店第2147483647位顾客,本店在搞一个活动,对本店第2147483647位顾客进行赠送活动.你先看看你有多少钱?” TMK一摸口袋,发现只有n个硬币,每个硬币的价值为a[i]. 然后店主继续说:“现在你用你的钱凑一些数,如果你的钱能凑成[0,x]里面所有的数,那么你将会免费获得该店价值x元的代金

洛谷P1194 买礼物

洛谷P1194 买礼物在买了第一次之后,你还要买 n-1次,把所有点都连起来,这样做一个最小生成树就行了,然后要注意题目中说了如果a[ i ][ j ]==0 则表示两个点是不相连的,赋值 inf 最后还要注意一下一开连第一条边是需要A的 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define For(i,j,k) for(int i=j;i<=k;i++) 4 using namespace std ; 5 6 const

P1194 买礼物

P1194 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第I样东西,再买第J样,那么就可以只花K[I,J]元,更巧的是,K[I,J]竟然等于K[J,I]. 现在明明想知道,他最少要花多少钱. 输入输出格式 输入格式: 第一行两个整数,A,B. 接下来B行,每行B个数,第I行第J个为K[I,J]. 我们保证K[I,J]=K[J,I]并且K[I,I]=0. 特别的,如果K[I,J]=0,那么表

洛谷——P1194 买礼物

P1194 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买B样东西,巧的是,这B样东西价格都是A元. 但是,商店老板说最近有促销活动,也就是: 如果你买了第I样东西,再买第J样,那么就可以只花K[I,J]元,更巧的是,K[I,J]竟然等于K[J,I]. 现在明明想知道,他最少要花多少钱. 输入输出格式 输入格式: 第一行两个整数,A,B. 接下来B行,每行B个数,第I行第J个为K[I,J]. 我们保证K[I,J]=K[J,I]并且K[I,I]=0. 特别的,如果K[I,J]=0,那么表

程序员从来没给丈母娘买礼物,真相竟然令人沉默

同事A,程序员,今年三十左右,已婚,有一女儿,技术好,开发经验足,平时工作也很勤奋,来公司两年,头发逐渐秃顶. 一日闲聊,A和我们抱怨,快要过年了,要给丈母娘准备礼物了.丈母娘老是跟他老婆抱怨A没有给自己买过礼物. 我们问他:"那你到底有没有买过礼物嘛?" A说:"没有买过." 我们都很惊讶:"你怎么从来不买礼物啊?多多少少都会买点吧,你这样别人肯定有意见了,哪有女婿从来不给岳父岳母买礼物的?" A又说:"我也想不到买什么,所以没买,但

LuoGu P1909 买铅笔???

题目描述 P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物.她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同.为了公平起 见,P老师决定只买同一种包装的铅笔. 商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物. 现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔*最少*需要花费多少钱. 输入格式: 输入的第一行包含一个正整数n,表示需要的铅笔数量. 接下来三行,每行用两个正整数描述一种包装的铅笔:

洛谷——买礼物

这题只要建一个虚点0,建B条连向0的边,权为A AB皆为题目给出的 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int maxn=510,maxm=300010; struct edge{int f,t,c;}e[maxm]; bool cmp(edge a,edge b){return a.c<b.c;} int fa[maxn],n,m=0

2017 9 24

当前最好成绩: noip2016 初赛32.5 模拟赛(3):140 模拟赛(6):270 评级:零 今天继续模拟,一上来用自己的公式A掉了T1,然后看了看T3看不懂题,也不知道样例怎么来的,于是一上午都在肝T2,写了一个暴力Floyd,n^3的时间复杂度,而且常数大的一批,然而过掉了300的数据.还写了20分的特殊情况,不知道什么原因炸掉了,只得了40分,加上T1一共有140分,加上day1就有270分了,双刷新最高纪录... 其余时间继续是图论,今天似乎是最小生成树专场,各种最小生成树的改编