• 刷题记录(NC13822 Keep In Line,NC16663 合并果子,NC16430 蚯蚓)


    NC13822 Keep In Line

    题目链接

    关键点: 

    1、建一个队列,每次出队时判断当前队列的头是否为要出队的人名,如果不是,有两种情况:

    (1)该同学插队,提前出来

    (2)可能该同学前面的同学均为插队的,那么该同学并没有插队

    所以我们要在保持原队列的基础上,标记那么插队(提前出来的人),这样每次判断时,就可以找到前面是否有插队的

    完整代码:

    1. # include
    2. using namespace std;
    3. int t, n;
    4. int main()
    5. {
    6. cin>>t;
    7. while (t--)
    8. {
    9. queueq;
    10. setse;
    11. int n, cnt=0;
    12. cin>>n;
    13. string s, name;
    14. for (int i=1; i<=n; i++)
    15. {
    16. // cout<
    17. cin>>s>>name;
    18. if (s[0]=='i')
    19. q.push(name);
    20. else
    21. {
    22. string chu = q.front();
    23. // cout<
    24. if (chu == name)
    25. {
    26. cnt++;
    27. q.pop();
    28. // cout<
    29. }
    30. else
    31. {
    32. if (se.empty())
    33. {
    34. se.insert(name);
    35. continue;
    36. }
    37. while (se.find(chu)!=se.end())
    38. {
    39. q.pop();
    40. chu = q.front();
    41. }
    42. if (chu == name)
    43. {
    44. cnt++;
    45. q.pop();
    46. // cout<
    47. }
    48. else
    49. se.insert(name);
    50. }
    51. }
    52. }
    53. cout<
    54. }
    55. return 0;
    56. }

     NC16663 合并果子

    题目链接

    关键点:

    三种做法

    一、双队列

    1、创建两个队列,第一个队列记录第一次输入时从小到大的果子,从该队列取两个最小的果子合并,再将合并后的果子存在第二个队列,我们可以发现,这样的取法使得第二个队列(即只存两个果子合并后的数)也为从小到大的排列,那么每次从两个队列中取最小的两个合并,再存入第二个队列中,且最后花费为每次合并后果子的大小

    代码:

    1. # include
    2. using namespace std;
    3. typedef long long ll;
    4. int n;
    5. int a[200000+10];
    6. long long sum;
    7. queueq1, q2;
    8. int main()
    9. {
    10. cin>>n;
    11. for (int i=1; i<=n; i++)
    12. cin>>a[i];
    13. sort(a+1, a+1+n);
    14. for (int i=1; i<=n; i++)
    15. q1.push(a[i]);
    16. for (int j=1; j
    17. {
    18. int x[3];
    19. for (int i=1; i<=2; i++)
    20. {
    21. if ((q1.front()front()&&!q1.empty()) || q2.empty())
    22. {
    23. x[i] = q1.front();
    24. q1.pop();
    25. }
    26. else
    27. {
    28. x[i] = q2.front();
    29. q2.pop();
    30. }
    31. }
    32. ll ans = x[1]+x[2];
    33. q2.push(ans);
    34. sum+=ans;
    35. }
    36. cout<
    37. return 0;
    38. }

    二、优先队列priority_queue

    我们直接用一个优先队列存所有果子(包括合并后的果子),每次从该队列中取两个,算出花费,并将其加入该队列,因为优先队列默认为大顶堆,即从大到小存,我们可以存其相反数,取出后再次相反即可

    1. # include
    2. using namespace std;
    3. typedef long long ll;
    4. int n;
    5. int a[10000+10];
    6. priority_queueq;
    7. ll sum;
    8. int main()
    9. {
    10. cin>>n;
    11. for (int i=1; i<=n; i++)
    12. {
    13. int x;
    14. cin>>x;
    15. q.push(-x);
    16. }
    17. for (int i=1; i
    18. {
    19. ll x = -q.top();
    20. q.pop();
    21. ll y = -q.top();
    22. q.pop();
    23. ll ans = x+y;
    24. q.push(-ans);
    25. sum+=ans;
    26. }
    27. cout<
    28. return 0;
    29. }

    三、手动实现优先队列

    首先建一个数组q,再记录一个数(last)记录数组最后一个下标。

    push(x),先将x存在最后一个下标中(++last)中,之后每次跟父亲结点比较,如果比父亲结点小则交换,直到不满足为止

    top直接输出p[1]

    pop(),先将最后一个结点赋给第一个结点,再去和最小的孩子比较大小,再交换,直到不满足为止

    1. # include
    2. using namespace std;
    3. typedef long long ll;
    4. int n;
    5. int a[100000+10];
    6. ll sum;
    7. ll q[100000+10];
    8. int last = 0;
    9. void push(int x)
    10. {
    11. last++;
    12. q[last] = x;
    13. int parent = last/2, i = last;
    14. while (q[parent]>q[i] && parent!=0)
    15. {
    16. swap(q[i], q[parent]);
    17. i = parent;
    18. parent = parent/2;
    19. }
    20. }
    21. void pop()
    22. {
    23. q[1] = q[last];
    24. int i = 1;
    25. last--;
    26. int c = i*2;
    27. if (q[c]>q[c+1]&&c+1<=last) c++;
    28. while (q[c]
    29. {
    30. swap(q[c], q[i]);
    31. i = c;
    32. c = i*2;
    33. if (q[c]>q[c+1]&&c+1<=last) c++;
    34. }
    35. }
    36. int top()
    37. {
    38. return q[1];
    39. }
    40. int main()
    41. {
    42. cin>>n;
    43. for (int i=1; i<=n; i++)
    44. {
    45. int x;
    46. cin>>x;
    47. push(x);
    48. }
    49. for (int i=1; i
    50. {
    51. int a = top();
    52. pop();
    53. int b = top();
    54. pop();
    55. ll ans = a+b;
    56. push(ans);
    57. sum+=ans;
    58. }
    59. cout<
    60. return 0;
    61. }

    NC16430 蚯蚓

    题目链接

    关键点: 

    1、首先用三个队列,第一个队列记录原始的蚯蚓,第二个记录被切掉的前段蚯蚓,第三个记录被切掉的后半段蚯蚓,每次从三个蚯蚓里找最大的数进行操作

    2、如何处理每次蚯蚓增加的长度:我们可以只在数组里记录数组一开始的长度,最后输出的时候再根据时间直接加上增加长度即可

    3、如何处理后出生的蚯蚓,可以将新出生的蚯蚓长度定义为当前长度-出生时间*q,这样就可以和直接就存在的蚯蚓计算时间方式相同

    完整代码:

    1. # include
    2. using namespace std;
    3. typedef long long ll;
    4. ll n, m, q, u, v, t;
    5. int a[1000000+10];
    6. queue qu[3];
    7. int main()
    8. {
    9. cin>>n>>m>>q>>u>>v>>t;
    10. for (int i=1; i<=n; i++)
    11. cin>>a[i];
    12. sort(a+1, a+1+n);
    13. for (int i=n; i>=1; i--)
    14. qu[0].push(a[i]);
    15. for (int i=1; i<=m; i++)
    16. {
    17. ll maxx = -1e18, pos = -1;
    18. for (int j=0; j<3; j++)
    19. {
    20. if (!qu[j].empty() && qu[j].front()>maxx)
    21. {
    22. maxx = qu[j].front();
    23. pos = j;
    24. }
    25. }
    26. qu[pos].pop();
    27. maxx += (i-1)*q;
    28. if (i%t==0) cout<" ";
    29. ll l = maxx*u/v, r = maxx - l;
    30. qu[1].push(l-i*q), qu[2].push(r-i*q);
    31. }
    32. cout<
    33. ll cnt = 1;
    34. while (!qu[0].empty()||!qu[1].empty()||!qu[2].empty())
    35. {
    36. ll maxx = -1e18, pos = -1;
    37. for (int i=0; i<3; i++)
    38. {
    39. if (!qu[i].empty()&&qu[i].front()>maxx)
    40. {
    41. pos = i;
    42. maxx = qu[i].front();
    43. }
    44. }
    45. qu[pos].pop();
    46. if (cnt%t == 0)
    47. cout<" ";
    48. cnt++;
    49. }
    50. cout<
    51. return 0;
    52. }

  • 相关阅读:
    Guava中ImmutableList的copyOf使用-将map转化为list方便遍历
    Bun v0.8.0 正式发布,Zig 编写的 JavaScript 运行时
    Kubernetes(K8S)的三种探针
    搜维尔科技:TechViz 虚拟现实在工业项目中沉浸式体验
    [单片机框架][bsp层][N32G4FR][bsp_adc] ADC配置和使用
    《从零开始的Java世界》04面向对象(高级)
    硬件描述语言(HDL)基础——层次结构
    学习笔记|模数转换器|ADC原理|STC32G单片机视频开发教程(冲哥)|第十七集:ADC采集
    docker学习:dockerfile和docker-compose
    聚已内酯共聚肝素 Heparin-PCL/聚乳酸-羟基乙酸共聚物-b-肝素 Heparin-PLGA/聚乳酸-b-肝素 Heparin-PLA
  • 原文地址:https://blog.csdn.net/m0_60531106/article/details/126025424