这题考场考虑不太全(但相比于60,其它90分的人,还是很全的(* ̄︶ ̄))
long long我是开了的,然后后面的特判我也是加了的,可是竟然打错了?!!
其实这题不需要打的像我这样麻烦:
设a[i]表示i点还需连接的边数
ans表示sigma(a[i])
max表示max(a[i])
如果max>ans/2,就说明全部连项那个最大值即可。
否则就输出ans/2。
只要判断一下
上标:
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
int n,m,K,a[100010],now=0;
ll ans=0;
inline int read()
{
int x=0; char c=getchar();
while (c<'0' || c>'9') c=getchar();
while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
int main()
{
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
n=read(),m=read(),K=read();
for (int i=1;i<=m;i++)
a[read()]++,a[read()]++;
for (int i=1;i<=n;i++)
{
a[i]=max(0,K-a[i]);
ans+=min(now,a[i]);
now=abs(now-a[i]);
}
if (ans>=(now>>1)) printf("%lld
",ans+(now+1>>1));
else printf("%lld
",ans+now);//这里我考场没加ans。。。
return 0;
}