245 条题解
-
-1Empire-003 LV 9 @ 2017-05-06 21:45:06
//AC100 留念 #include <bits/stdc++.h> using namespace std; int data[205]; int main() { int n, k, tmp, ans = 0; cin >> n >> k; for(int i = 1; i <= n; i++) while(cin >> tmp && tmp != 0) data[tmp]++; for(int i = 1; i <= n; i++) if(data[i] >= k) ans++; cout << ans << endl; return 0; }
-
-12017-05-01 00:25:47@
唯心主义代码
#include<cstdio> using namespace std; struct hua{int a;int e=0;}; int main(){ int res=0,n,k; hua name[40000]; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) while(scanf("%d",&name[i].a)==1&&name[i].a!=0) name[i].e++; for(int i=1;i<=n;i++) if(name[i].e>=k) res++; printf("%d",res); return 0; }
-
-12016-12-09 18:19:48@
#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxa 10000
using namespace std;
int n,a[maxa];
int main()
{
int n,k,ans = 0,cnt,x;
cin>>n>>k;
while(n--)
{
cnt = 0;
while(cin>>x&&x)
cnt++;
if(cnt>=k)
ans++;
}
cout<<ans<<endl;
return 0;
} -
-12016-08-05 15:54:53@
你TM在逗我
这就是传说中的贪心
```pascal
program VictoriaBall;
var n,k,m,i,t,l:longint;begin
readln(n,k);
m:=0;
for i:=1 to n do
begin
read(t);
l:=0;
while t<>0 do
begin
inc(l);
read(t);
end;
if l>=k then inc(m);
end;writeln(m);
end.
``` -
-22018-02-08 21:09:29@
发表一下正解的思路
首先普遍的做法是判断每个人有多少的原意沟通的人,如果人数大于K,就让结果加一
但是这个思路很容易就可以证明不对,能过只是因为数据水
我们考虑这样一种情况:一个人有很多个愿意沟通的人,但是他所愿意沟通的人都无法来到,那么这个人能够来吗?
显然不能
介绍一下标解的思路:
建立一张无向图,每两个原意沟通的人之间有一条边相连
这张图有两个性质
1.一个出度小于K的点必然被删除
2.若该图中每个点的出度都不小于K,该图一定符合要求,因为我们可以把所有人都选上
这样的话我们就可以用弗洛伊德维护这张图,逐渐删去出度小于K的点,每删去一个点,把所有与该点相连的点的出度减1
当删到满足性质2时,便符合要求,且一定是最优的
附上AC代码#include<iostream> using namespace std; int map[210][210],ll[210],pan[210]; int main() { int n,k,i,j,a=1,sum; cin>>n>>k; sum=n; for(i=1;i<=n;i++) { while(1) { cin>>a; if(a==0) break; map[i][a]=1; map[a][i]=1; ll[i]++; } } for(int e=1;e<=n;e++) for(i=1;i<=n;i++) { if(ll[i]<k&&!pan[i]) { pan[i]=1; sum--; for(j=1;j<=n;j++) { if(map[i][j]) ll[j]--; } } } cout<<sum; return 0; }