首页 > 其他分享 >洛谷P1194 买礼物之警钟敲爆

洛谷P1194 买礼物之警钟敲爆

时间:2024-08-08 20:40:30浏览次数:6  
标签:选点 洛谷 int 样例 vis 敲爆 Downarrow each 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\),那么表示这两样东西之间不会导致优惠。

注意 \(K_{I,J}\) 可能大于 \(A\)。

输出格式

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

样例 #1

样例输入 #1

1 1
0

样例输出 #1

1

样例 #2

样例输入 #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\le B\le 10\)。

对于 \(100\%\) 的数据,\(1\le B\le500,0\le A,K_{I,J}\le1000\)。

2018.7.25新添数据一组


此题看似不难,实则确实不难,可说是板子。但敲完后,窝整整调了一个多小时,这样例太水了结果发现读入挂了TNT。


正片开始

1.审题

  1. 注意到\(k_{i,j}=k_{j,i}\),显然这是一个无向图,每个东西买一次求最小价值,更显然是最小生成树。
  2. 还需注意:\(k_{i,j}=0\)时的特殊情况。
  3. 还有\(k_{i,j}\)可能大于\(A\)。需要我们取下\(min\)。

读入部分:

code:

cin>>a>>n;
for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    {
        ll w;cin>>w;
        if(i!=j&&w!=0) w=min(w,a);
        else w=a;
        g[i].push_back(make_pair(j,w));
        g[j].push_back(make_pair(i,w));
    }

2.prim模板

将所有点分成已选点和待选点两个集合,每次遍历待选点的集合,选择边权最小的边,再更新与此次选择的点相接的点的距离,直到待选点集合为零即可。

code:

void prim()
{
    for(int i=0;i<=n;i++) d[i]=a;//初始化距离
    d[1]=0;//第一个点的距离为零
    ans+=a;//第一个必须以原价进入
    while(1)
    {
        int u=-1;
        for(int i=1;i<=n;i++){if(!vis[i]&&(u==-1||d[u]>d[i]))u=i;}//寻找最小的点
        if(u==-1) break;//待选点集合为空
        vis[u]=1;ans+=d[u];//加入被选择的点
        for(auto each:g[u])
        {
            ll v=each.first,w=each.second;
            if(vis[v]) continue;
            d[v]=min(d[v],w);
        }//更新距离
    }
    cout<<ans<<endl;
}

完整代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
ll n,a,ans=0,d[N],vis[N];
vector<pair<ll,ll> >g[N];
void prim()
{
    for(int i=0;i<=n;i++) d[i]=a;
    d[1]=0;
    ans+=a;
    while(1)
    {
        int u=-1;
        for(int i=1;i<=n;i++){if(!vis[i]&&(u==-1||d[u]>d[i]))u=i;}
        if(u==-1) break;
        vis[u]=1;ans+=d[u];
        for(auto each:g[u])
        {
            ll v=each.first,w=each.second;
            if(vis[v]) continue;
            d[v]=min(d[v],w);
        }
    }
    cout<<ans<<endl;
}
int main()
{
    cin>>a>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            ll w;cin>>w;
            if(i!=j&&w!=0) w=min(w,a);
            else w=a;
            g[i].push_back(make_pair(j,w));
            g[j].push_back(make_pair(i,w));
        }
    prim();
    return 0;
}

审题不规范,oi两行泪。

完结收工!!!!!

个人主页

看完点赞,养成习惯

\(\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\)

标签:选点,洛谷,int,样例,vis,敲爆,Downarrow,each,P1194
From: https://www.cnblogs.com/qc0817/p/18349688

相关文章

  • 洛谷:P1308 [NOIP2011 普及组] 统计单词数
    题目描述一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要......
  • 洛谷 P1019 [NOIP2000 提高组] 单词接龙 题解
    暴搜!!暴搜!!暴搜!!重要的事情说三遍#include<bits/stdc++.h>usingnamespacestd;constintN=25;intn,ans,use[N];strings,word[N];voiddfs(strings){intls=s.size();//s的lengthans=max(ans,ls);//求出最长的单词接龙for(inti=0;i<n......
  • 洛谷P2404 自然数的拆分问题——题解
    洛谷P2404题解传送锚点摸鱼环节自然数的拆分问题题目描述任何一个大于\(1\)的自然数\(n\),总可以拆分成若干个小于\(n\)的自然数之和。现在给你一个自然数\(n\),要求你求出\(n\)的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列......
  • 洛谷 P1125 [NOIP2008 提高组] 笨小猴
    [NOIP2008提高组]笨小猴题目描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn......
  • 洛谷P1064 金明的预算方案——题解
    洛谷P1064题解传送锚点摸鱼环节[NOIP2006提高组]金明的预算方案题目描述金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过\(n\)元钱就行”。今天......
  • 洛谷P8869 莲子的软件工程学之警钟长鸣
    洛谷P8869题解传送锚点摸鱼环节[传智杯#5初赛]A-莲子的软件工程学题目背景在宇宙射线的轰击下,莲子电脑里的一些她自己预定义的函数被损坏了。对于一名理科生来说,各种软件在学习和研究中是非常重要的。为了尽快恢复她电脑上的软件的正常使用,她需要尽快地重新编写这么一......
  • 洛谷P3842 线段——题解
    洛谷P3842题解传送锚点摸鱼环节[TJOI2007]线段题目描述在一个\(n\timesn\)的平面上,在每一行中有一条线段,第\(i\)行的线段的左端点是\((i,L_{i})\),右端点是\((i,R_{i})\)。你从\((1,1)\)点出发,要求沿途走过所有的线段,最终到达\((n,n)\)点,且所走的路程长度要尽......
  • 洛谷P1786 帮贡排序
    6.帮贡排序题目背景在absi2011的帮派里,死号偏多。现在absi2011和帮主等人联合决定,要清除一些死号,加进一些新号,同时还要鼓励帮贡多的人,对帮派进行一番休整。题目描述目前帮派内共最多有一位帮主,两位副帮主,两位护法,四位长老,七位堂主,二十五名精英,帮众若干。现在absi2011要......
  • 洛谷P1480 A/B Problem
    4.高精度除以低精度题目叙述:A/BProblem题目描述输入两个整数\(a,b\),输出它们的商。输入格式两行,第一行是被除数,第二行是除数。输出格式一行,商的整数部分。样例#1样例输入#1102样例输出#15提示\(0\lea\le10^{5000}\),\(1\leb\le10^9\)。代码本题为高精......
  • 洛谷B3621枚举元组
    一道经典dfs题,很简单就是让你求1~k能组成多少个n位数。当然耐心足够的朋友可以尝试打表。dfs思路:1.定义数组a来存储每一次的组合,其中a[i]表示第i位的数字;3.递归一定要设定终止条件:如果枚举到了n+1位时,输出数组a并returnCode#include<bits/stdc++.h>usingnamespa......