• 刷题记录(NC235611 牛牛国的战争,NC23803 DongDong认亲戚,NC235622 叠积木)


    NC235611 牛牛国的战争

    题目链接

    关键点

    1、因为要在能击败所有敌军的基础下,求存活最多的数量,那么我们可以对敌军的防御力从大到小排列,对于友军的攻击力从大到小排列,这样遍历一次敌军,将所有可以击败该敌军的友军防御力存入multiset,因为防御力可能会重复

    2、对于多个可以击败敌军的友军,我们挑选那个刚刚好可以击败敌军且存活的,如果没有,那么横竖都为失去一个友军,干脆失去那个防御力最低的

    3、对于存活的计算,我们再选择友军时,可能所有的友军不会都加入set中,因此最后要加上,同样的set里的所有元素不一定都会上场,也得加上

    完整代码

    1. # include
    2. # include
    3. # include
    4. # include
    5. using namespace std;
    6. const int N = 100000+10;
    7. int t, n, m;
    8. multiset<int>s;
    9. struct fri{
    10. int g, f;
    11. }f[N];
    12. struct di{
    13. int g, f;
    14. }d[N];
    15. bool cmp1(fri f1, fri f2)
    16. {
    17. return f1.g>f2.g;
    18. }
    19. bool cmp2(di d1, di d2)
    20. {
    21. return d1.f>d2.f;
    22. }
    23. int main()
    24. {
    25. cin>>t;
    26. for (int k=1; k<=t; k++)
    27. {
    28. s.clear();
    29. cin>>n>>m;
    30. for (int i=1; i<=n; i++)
    31. {
    32. cin>>f[i].g>>f[i].f;
    33. }
    34. for (int i=1; i<=m; i++)
    35. cin>>d[i].g>>d[i].f;
    36. sort(f+1, f+1+n, cmp1);
    37. sort(d+1, d+1+m, cmp2);
    38. int pos = 1, ans = 0, flag = 0;
    39. for (int i=1; i<=m; i++)
    40. {
    41. while (f[pos].g>=d[i].f && pos<=n)
    42. {
    43. // cout<
    44. s.insert(f[pos].f);
    45. pos++;
    46. }
    47. if (s.size()==0)
    48. {
    49. flag = 1;
    50. cout<<"Case #"<": -1"<
    51. break;
    52. }
    53. auto it = s.upper_bound(d[i].g);
    54. if (it!=s.end())
    55. {
    56. ans++;
    57. s.erase(it);
    58. }
    59. else
    60. {
    61. s.erase(s.begin());
    62. }
    63. // cout<
    64. }
    65. // cout<
    66. if (!flag)
    67. cout<<"Case #"<": "<size()+n+1-pos<
    68. }
    69. return 0;
    70. }

    NC23803 DongDong认亲戚

    题目链接

    关键点:

    1、利用map来使名字对应数字,然后直接上并查集

    完整代码

    1. # include
    2. # include
    3. # include
    4. using namespace std;
    5. const int N = 200000+10;
    6. int n, m;
    7. int fa[N];
    8. mapint>mp;
    9. int find(int x)
    10. {
    11. return (x==fa[x])? x: fa[x] = find(fa[x]);
    12. }
    13. void unite(int x, int y)
    14. {
    15. fa[find(x)] = find(y);
    16. }
    17. int main()
    18. {
    19. for (int i=0; i
    20. fa[i] = i;
    21. cin>>n>>m;
    22. for (int i=1; i<=n; i++)
    23. {
    24. string s;
    25. cin>>s;
    26. mp[s] = i;
    27. }
    28. for (int i=1; i<=m; i++)
    29. {
    30. int x;
    31. string a, b;
    32. cin>>x>>a>>b;
    33. if (x==2)
    34. {
    35. int f1 = find(mp[a]), f2 = find(mp[b]);
    36. if (f1==f2)
    37. cout<<"1"<
    38. else
    39. cout<<"0"<
    40. }
    41. else
    42. unite(mp[a], mp[b]);
    43. }
    44. return 0;
    45. }

    NC235622 叠积木

    题目链接

    关键点:

    1、我们用一个fa数组存每个积木的父亲(设为该积木的最底下的积木),一个d数组存每个积木到最底下有多少个积木,一个cnt数组存该积木一共有多少(下标为最底下的积木)

    2、对于每一次的搭建,比如从x->y,先找到x的父亲fx,y的父亲fy,判断不相等后将

    fa[fx] = fy,d[fx] = cnt[fy](当前x父亲(即x最底下的积木距离此时的父亲结点(fy)的距离为y积木的数量)), cnt[fy]+=cnt[fx](y积木的数量加上x积木的数量)

    3、对于find,除了fa[x] = find(fa[x]);还有d[x] += d[fa[x]],不断更新该积木与父亲的距离

    完整代码

    1. # include
    2. # include
    3. using namespace std;
    4. const int N = 30000+10;
    5. int n;
    6. int fa[N], d[N], cnt[N];
    7. int find(int x)
    8. {
    9. if (fa[x]!=x)
    10. {
    11. int t = find(fa[x]);
    12. d[x] += d[fa[x]];
    13. fa[x] = t;
    14. }
    15. return fa[x];
    16. }
    17. void unite(int x, int y)
    18. {
    19. int f1 = find(x), f2 = find(y);
    20. if (f1!=f2)
    21. {
    22. fa[f1] = f2;
    23. d[f1] = cnt[f2];
    24. cnt[f2] += cnt[f1];
    25. }
    26. }
    27. int main()
    28. {
    29. cin>>n;
    30. for (int i=1; i<=N; i++)
    31. {
    32. fa[i] = i;
    33. d[i] = 0;
    34. cnt[i] = 1;
    35. }
    36. for (int i=1; i<=n; i++)
    37. {
    38. char c;
    39. cin>>c;
    40. if (c=='M')
    41. {
    42. int x, y;
    43. cin>>x>>y;
    44. unite(x, y);
    45. }
    46. else
    47. {
    48. int x;
    49. cin>>x;
    50. find(x);
    51. cout<
    52. }
    53. }
    54. return 0;
    55. }

  • 相关阅读:
    高级架构师_Docker_第2章_ Docker核心原理_ 第2节_Docker网络
    【蓝桥杯软件赛 零基础备赛20周】第3周——填空题
    范西特-泽尼克定理的证明
    并查集快速合并
    Mobile-Former: Bridging MobileNet and Transformer详解
    办理河南公司名称变更成无区域名称核名条件和流程
    C,C++中原生数组索引的奇怪写法
    【Python算法Algorithm】专栏导读
    Android并发编程与多线程
    ESP32学习笔记 - 基于 ESP32 移植 LVGL8.3
  • 原文地址:https://blog.csdn.net/m0_60531106/article/details/126237035