链接:https://www.jisuanke.com/contest/2346?view=challenges
第一题
需要删除的骨牌满足的条件为:
[1]:出度最大;
[2]:出度相同判断有无入度;
vector<int >out[maxn];///out[x]:存x指出去的点 int in[maxn];///in[x]:x的入度 #include<bits/stdc++.h> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define ll long long const int maxn=5e3+50; int n; vector<int >out[maxn]; int in[maxn]; bool vis[maxn]; void Update() { int t=0; for(int i=1;i <= n;++i) { if(vis[i] || out[i].size() < out[t].size()) continue; if(t == 0) t=i; if(out[i].size() > out[t].size() || in[i] > 0) t=i; } for(int i=0;i < out[t].size();++i) in[out[t][i]]--; vis[t]=true; } int Solve() { mem(vis,false); if(n <= 2) return 0; Update(); Update(); int ans=0; for(int i=1;i <= n;++i) if(!vis[i] && in[i] == 0) ans++; return ans; } int main() { scanf("%d",&n); for(int i=1;i < n;++i) { int x,y; scanf("%d%d",&x,&y); out[x].push_back(y); in[y]++; } printf("%d\n",Solve()); return 0; }额,真没想到贪心居然能过。
算了顺便写一下窝WA了的解法:额,跑联通块居然WA了,忒惨了
#include<iostream> #include<algorithm> #include<vector> #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 100005; const ll mod = 1e9+7; const ll INF = 0x3f3f3f3f; const double eps = 1e-9; vector<int>v[maxn]; bool vis[maxn]; int ans=0; void dfs(int x){ vis[x]=true; for(int i=0;i<v[x].size();i++) { int next=v[x][i]; if(!vis[next]) dfs(next); } } int main(){ int n; scanf("%d",&n); for(int i=0;i<n-1;i++){ int x,y; scanf("%d %d",&x,&y); v[x].push_back(y); } v[1].clear(); int num=0;int flag=0; for(int i=2;i<=n;i++){ if(num<v[i].size()){ num=v[i].size(); flag=i; } } v[flag].clear();int ans=0; for(int i=2;i<=n;i++){ if(!vis[i]){ dfs(i); ans++; } } cout<<ans<<endl; return 0; }第二题 未补完
第三题 未补完
第四题 未补完