战略游戏c++代码

一道不错的贪心题。
贪心:如果从叶向根广度操作,当一个节点的父亲节点的所有儿子全部都操作过就对它进行操作,那么如果该节点有一个儿子没有点亮(即被瞭望到,或者说被覆盖。)那么想该儿子一定所有儿子节点都已经进行过操作了(因为是广度,操作一个点的前提是它的所有儿子节点都操作过。),那么点亮该点必然只能点亮它本身和它的父亲节点,而点亮它的父亲节点则是至少点亮它本身和它的父亲节点(因为父亲节点可能还有其他节点。)。在费用相同的情况下,无论如何点亮父亲节点都是较优的决策。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. vector<int>tree[1505];
  4. queue<int>q;
  5. int f[1505],root,ans,a,k,point,n,output[1505];//解释:从左到右依次为父亲,根,答案,输入项*4,出度。
  6. int light[1505];
  7. int main(){
  8. std::ios::sync_with_stdio(false);
  9. cin>>n;
  10. for(register int i=1;i<=n;i++)f[i]=-1;
  11. if(n==1){//对单节点比较省事的特判
  12. cout<<"1";
  13. return 0;
  14. }
  15. for(register int i=1;i<=n;i++){
  16. cin>>a>>k;
  17. for(register int j=1;j<=k;j++){
  18. cin>>point;
  19. tree[a].push_back(point);
  20. f[point]=a;
  21. }
  22. }
  23. for(register int i=0;i<n;i++)if(tree[i].size()==0){q.push(i);}
  24. for(register int i=0;i<n;i++)if(f[i]==-1)root=i;
  25. for(register int i=0;i<n;i++)output[i]=tree[i].size();
  26. while(!q.front()==root){
  27. int now=q.front();
  28. q.pop();
  29. output[f[now]]--;
  30. if(!light[now]){light[f[now]]=1;}//如果自己没被点亮,就点亮父亲
  31. if(output[f[now]]==0)q.push(f[now]);//如果父亲的儿子都处理了,就等会处理父亲
  32. }
  33. for(register int i=0;i<n;i++)if(light[i]==1)ans++;
  34. cout<<ans;
  35. }
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值