1.OpenCV学习
2.Javaweb前端
3.算法基础练习
1.OpenCV学习
2.Javaweb前端
Hbuilder写代码:
边框:
3.算法基础练习
题目描述
又到了一年一度的明明生日了,明明想要买 B 样东西,巧的是,这 B 样东西价格都是 A 元。
但是,商店老板说最近有促销活动,也就是:
如果你买了第 I 样东西,再买第 J 样,那么就可以只花 KI,J 元,更巧的是,KI,J 竟然等于 KJ,I。
现在明明想知道,他最少要花多少钱。
输入格式
第一行两个整数A,B。
接下来 B行,每行 B个数,第 I行第 J个为 KI,J
我们保证 K_{I,J}=K_{J,I}KI,J=KJ,I 并且 K_{I,I}=0KI,I=0。
特别的,如果 K_{I,J}=0KI,J=0,那么表示这两样东西之间不会导致优惠。
输出格式
一个整数,为最小要花的钱数。
输入输出样例
输入
1 1 0
输出
1
输入
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<bits/stdc++.h>
using namespace std;
int n,m,cnt,flag,px,py,ans,f[10000];
struct p{int x,y,z;
}a[250008];
int find(int x){if (x==f[x]) return x;return f[x]=find(f[x]);
}
bool cmp(p a,p b){return a.z<b.z;
}
int main(){scanf("%d%d",&n,&m);for (int i=0;i<=m;i++) f[i]=i;for (int i=1;i<=m;i++){cnt++;a[cnt].x=0;a[cnt].y=i;a[cnt].z=n;} for (int i=1;i<=m;i++)for (int j=1;j<=m;j++){ scanf("%d",&flag);if (flag){cnt++;a[cnt].x=i;a[cnt].y=j;a[cnt].z=flag; } }sort(a+1,a+cnt+1,cmp);for (int i=1;i<=cnt;i++){px=find(a[i].x);py=find(a[i].y);if (px==py) continue;f[px]=py;ans+=a[i].z;}printf("%d\n",ans);return 0;
}