NC24200. [USACO 2019 Jan S]Grass Planting
描述
Farmer John当然可以在每块草地里种不同种类的草,但是他想要使得使用的草的种类数最小,因为他用的草的种类数越多,他就需要负担更高的花费。
不幸的是,他的奶牛们对选择农场上的草表现得十分苛刻。如果两块相邻(由一条小路直接相连)的草地种了同一种草,或者即使是两块接近相邻(均可由一条小路直接连向同一块草地)的草地,那么奶牛们就会抱怨她们进餐的选择不够多样。Farmer John能做的只能是抱怨这些奶牛,因为他知道她们不能被满足的时候会制造多大的麻烦。
请帮助Farmer John求出他的整个农场所需要的最少的草的种类数。
输入描述
输入的第一行包含N。以下N−1行每行描述了一条小路连接的两块草地。
输出描述
输出Farmer John需要使用的最少的草的种类数。
示例1
输入:
4 1 2 4 3 2 3
输出:
3
说明:
在这个简单的例子中,4块草地以一条直线的形式相连。最少需要三种草。例如,Farmer John可以用草A,B和C将草地按A - B - C - A的方式播种。C(clang 3.9) 解法, 执行用时: 23ms, 内存消耗: 756K, 提交时间: 2020-09-06 16:40:34
#include<stdio.h> int main(){ int n,a,b; int ans=0; int x[100005]={0}; scanf("%d",&n); n=n-1; while(n--){ scanf("%d%d",&a,&b); x[a]++; x[b]++; if(x[a]>ans)ans=x[a]; if(x[b]>ans)ans=x[b]; } ans=ans+1; printf("%d",ans); return 0; }
C++14(g++5.4) 解法, 执行用时: 39ms, 内存消耗: 1888K, 提交时间: 2019-06-24 23:19:31
#include<cstdio> int x,y,ans,n,deg[100007]; int main() { scanf("%d",&n); for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); if(++deg[x]>ans)ans=deg[x]; if(++deg[y]>ans)ans=deg[y]; } printf("%d",ans+1); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 42ms, 内存消耗: 788K, 提交时间: 2020-02-26 23:45:52
#include<bits/stdc++.h> using namespace std; int a[100200]; int n,x,y,ans; int main() { cin>>n; while(~scanf("%d%d",&x,&y)) { a[x]++; a[y]++; } for(int i=1;i<=n;i++) { ans=max(ans,a[i]); } printf("%d\n",ans+1); }
pypy3(pypy3.6.1) 解法, 执行用时: 280ms, 内存消耗: 24932K, 提交时间: 2020-09-05 21:48:38
def gt(): return list(map(int, input().split())) n ,= gt() deg = [0 for i in range(n+1)] for i in range(n-1): a,b = gt() deg[a] += 1 deg[b] += 1 print(max(deg)+1)