版权声明:转载请声明出处,谢谢配合。 https://blog.csdn.net/zxyoi_dreamer/article/details/82530998
解析:
好的读完题不要慌。。。这道题和图论半毛钱关系都没有。。。
这是今日份的签到题。
因为整个图是联通的,我们就只需要考虑求这样一个东西的最大值 ,显然,这是一道贪心。。。
如果输入不保证联通,就加一个 或者 ,(总算是扯到图论上了。。。)
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define gc getchar
#define pc putchar
#define cs const
inline
ll getint(){
re ll num=0;
re char c=gc();
while(!isdigit(c))c=gc();
while(isdigit(c))num=(num<<1)+(num<<3)+(c^48),c=gc();
return num;
}
inline
void outint(ll a){
static char ch[23];
if(a==0)pc('0');
if(a<0)pc('-'),a=-a;
while(a)ch[++ch[0]]=(a-a/10*10)^48,a/=10;
while(ch[0])pc(ch[ch[0]--]);
}
int p[200003];
int n,m;
inline
bool cmp(cs int &a,cs int &b){
return a>b;
}
int main(){
n=getint();m=getint();
for(int re i=1;i<=n;++i)p[i]=getint();
sort(p+1,p+n+1,cmp);
ll sum=0;
for(int re i=1;i<=n;++i){
if(p[i]<i-1)break;
sum+=p[i]-(i-1);
}
outint(sum);
return 0;
}