3.小张的工厂里的厂房受到台风的袭击,导致部分厂房的顶棚遭到了破坏,急需修理。厂房是由一间间的相同宽度的隔间组成,这些隔间都是连在一起的,连成了一条直线,隔间采用塑钢板作为顶棚,多个隔间可以共用一块长的塑钢板。这些隔间里有的有货物,有的没有货物,因为考虑到最近可能还会有台风,所以必须把有货物的隔间的顶棚修理好。 目前塑钢板的供应商能提供的板材的数量有限制,但长度没有限制,所以小张只能尽量的减少板材的数量。请你帮助小张计算需要采购塑钢板的最小长度。
输入格式 第1行:M,S和C(用空格分开)。M为能买到的板材的最大数目(1<=M<=50),S为厂房总的隔间的数量,1<=S<=200,C为有货物的隔间的数量。 第2到C+1行:每行包含一个整数,表示有货物的隔间的编号。编号从1开始,1<=C<=S
输出格式 输出一行,采购的塑钢板的总长度。
输入输出样列 输入样例1: 1 10 4 2 5 7 8 输出样例1: 7
思路:对编号排序用最大的编号减最小的然后加一(网上题解说是最小生成树,我觉得没那么麻烦,代码实现功能和题解一样)
AC代码:
#include <iostream> #include <algorithm> using namespace std; int main() { int m, s, c; cin >> m >> s >> c; int a[c]; for (int i = 0; i < c; i++) { cin >> a[i]; } sort(a, a + c); cout<<a[c-1]-a[0]+1<<endl; return 0; }
网上最小生成树
#include<iostream> #include<algorithm> using namespace std; const int MAXN=205; const int MAXM=40010; int M,S,C; int cnt=0; int num=0; int ans=0; int f[MAXN]; int a[MAXN]; struct Edge { int u,v,w; bool operator<(const Edge a)const{ return w<a.w; } }e[MAXM]; int Find(int x) { if(x==f[x]) return x; return f[x]=Find(f[x]); } void Merge(int x,int y) { f[Find(x)]=Find(y); } int main() { //freopen("D:\\test.txt","r",stdin); cin>>M>>S>>C; for(int i=0;i<=S;++i) { f[i]=i; } for(int i=1;i<=C;++i) { cin>>a[i]; for(int j=1;j<i;++j) { e[++cnt].u=a[i]; e[cnt].v=a[j]; e[cnt].w=max(a[i]-a[j],a[j]-a[i]); } } sort(e+1,e+cnt+1); for(int i=1;i<=cnt;++i) { if(Find(e[i].u)!=Find(e[i].v)) { num++; Merge(e[i].u,e[i].v); ans+=e[i].w; if(num==C-M) { break; } } } cout<<ans+M<<endl; return 0; }