• 牛客小白月赛80 A-D


    时间原因 快速水了A——D

    A、

    题目描述

    现在给你一个递推公式:
    n=0 an=1  ; n=1 an=2  ;n>1 an=2*a(n-1)-a(n-2)
    求该数列的第 n 项。由于答案可能过大,你只需要输出答案对 998244353 取模后的值。

    输入描述:

    一个正整数 n (1≤n≤998244351) 。
    

    输出描述:

    一个整数,对应答案。

    示例1

    输入

    1

    输出

    2

    示例2

    输入

    2

    输出

    3

    备注:

    如果没有解题思路,可以算一下前几项看看。
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. #define fp(i,a,b) for(int i=a;i<=b;++i)
    5. #define PII pair<int,int>
    6. const int N=2e5+10;
    7. const int mod=1e9+7;
    8. const double eps=1e-5;
    9. typedef double db;
    10. int n;
    11. signed main()
    12. {
    13. cin>>n;
    14. cout<<n+1<<"\n";
    15. return 0;
    16. }

     B、

    题目描述

    校园里目前有 N 名学生,这些学生属于 M 个班级。第 i 个人属于第Ai​ 个班级。突然,放学铃声响起,你还没来得及思索,就已经有 K 名学生已经冲出了学校。你不知道已经跑出学校的学生属于哪些班级,但是,你想知道,目前还没出校的学生中,最多有多少学生是属于同一个班级的。

    输入描述:

    第一行三个正整数 N (1≤N≤10^5), M(1≤M≤N),K(1≤K≤N)含义如上所述。

    第二行 N 个正整数 Ai​(1≤Ai≤M),含义如上所述。

    输出描述:

    一个整数,表示目前学校里最多有多少同学是属于同一个班级的。

    示例1

    输入

    6 3 3
    3 1 2 3 3 2

    输出

    3
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. #define fp(i,a,b) for(int i=a;i<=b;++i)
    5. #define PII pair<int,int>
    6. const int N=2e5+10;
    7. const int mod=1e9+7;
    8. const double eps=1e-5;
    9. typedef double db;
    10. int n,m,k;
    11. int a[N];
    12. int cnt[N];
    13. signed main()
    14. {
    15. int mmax=0;
    16. cin>>n>>m>>k;
    17. fp(i,1,n)cin>>a[i],cnt[a[i]]++,mmax=max(mmax,a[i]);
    18. sort(cnt+1,cnt+1+mmax);
    19. int sum=0;
    20. for(int i=1;i<=mmax-1;i++)
    21. {
    22. sum+=cnt[i];
    23. }
    24. if(sum>=k)
    25. {
    26. cout<<cnt[mmax];
    27. }
    28. else
    29. {
    30. cout<<cnt[mmax]-(k-sum);
    31. }
    32. return 0;
    33. }

     C、

    题目描述

    本题和 D 题的唯一区别是 N 的范围。
    校园里目前有 N 名学生,这些学生属于 M 个班级。第 i(i=1,2,...,N)个人属于第Ai​ 个班级。突然,放学铃声响起,你还没来得及思索,就已经有 K 名学生已经冲出了学校。然而,由于某班级的老师还在拖堂,可以确定这个班级目前还没有任何学生离校。现在请你求出,假设恰好只有班级 j(j=1,2,...,M)的老师还在拖堂,在剩下的未拖堂的班级中,还留在学校的人数最多的班级的最少的可能人数是多少。

    输入描述:

    第一行三个正整数 N(1≤N≤10^2),M(1≤M≤N),K(1≤K≤N)含义如上所述。
    第二行 N个正整数 Ai​(1≤Ai≤M),含义如上所述。

    输出描述:

    M个整数,第 i 个整数表示恰好只有班级 i 的老师还在拖堂,在剩下的未拖堂的班级中,还留在学校的人数最多的班级的最少的可能人数是多少。如果班级 i 拖堂就不可能有 K 名学生冲出学校,则输出 -1。
    

    示例1

    输入

    6 3 3
    3 1 2 3 3 2

    输出

    1 1 0

    示例2

    输入

    6 3 4
    3 1 2 3 3 2

    输出

    1 0 -1
    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. #define fp(i,a,b) for(int i=a;i<=b;++i)
    5. #define PII pair<int,int>
    6. const int N=2e5+10;
    7. const int mod=1e9+7;
    8. const double eps=1e-5;
    9. typedef double db;
    10. int n,m,k;
    11. int a[N];
    12. int cnt[N];
    13. int cnts[N];
    14. signed main()
    15. {
    16. cin>>n>>m>>k;
    17. fp(i,1,n)cin>>a[i],cnt[a[i]]++;
    18. for(int i=1;i<=m;i++)
    19. {
    20. if(n-cnt[i]<k)
    21. {
    22. cout<<-1<<" ";
    23. continue;
    24. }
    25. for(int j=0;j<=n;j++)
    26. {
    27. int sum=0;
    28. for(int t=1;t<=m;t++)
    29. {
    30. if(t==i)continue;
    31. sum+=max(0ll,cnt[t]-j);
    32. }
    33. if(sum<=k)
    34. {
    35. cout<<j<<" ";
    36. break;
    37. }
    38. }
    39. }
    40. return 0;
    41. }

     O(n^3)暴力

    D、

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. #define int long long
    4. #define fp(i,a,b) for(int i=a;i<=b;++i)
    5. #define PII pair<int,int>
    6. const int N=2e6+10;
    7. const int mod=1e9+7;
    8. const double eps=1e-5;
    9. typedef double db;
    10. int n,m,k;
    11. int a[N];
    12. int sum1[N],sum2[N];
    13. int calc(int x,int i){
    14. return (sum2[x]-(a[i]>=x)*a[i])-(sum1[x]-(a[i]>=x))*x;
    15. }
    16. signed main()
    17. {
    18. cin>>n>>m>>k;
    19. int x;
    20. for(int i=1;i<=n;i++)cin>>x,a[x]++;
    21. for(int i=1;i<=m;i++)
    22. sum1[a[i]]++,sum2[a[i]]+=a[i];
    23. for(int i=n-1;i>=0;i--)sum1[i]+=sum1[i+1],sum2[i]+=sum2[i+1];
    24. for(int i=1;i<=m;i++){
    25. if(n-a[i]<k){
    26. cout<<-1<<" ";
    27. continue;
    28. }
    29. int l=0,r=n;
    30. while(l<r){
    31. int mid=(l+r)>>1;
    32. if(calc(mid,i)<=k)r=mid;
    33. else l=mid+1;
    34. }
    35. cout<<l<<" ";
    36. }
    37. return 0;
    38. }

    O(nlogn) 后缀优化+二分

  • 相关阅读:
    Mybatis的Mapper文件报错:Tag name expected
    JupyterNotebook中导出当前环境,并存储为requirements.txt
    【C】程序环境和预处理
    华为机试真题 Java 实现【全量和已占用字符集】
    基于信息增强传输的时空图神经网络交通流预测
    Ubuntu里安装CMake步骤
    第六篇:元数据管理之“灵魂”三问
    一文读懂uniapp中的tabBar底部导航
    2023-06-13:统计高并发网站每个网页每天的 UV 数据,结合Redis你会如何实现?
    2023火锅展/江西火锅食材展/中国火锅展/火锅用品展
  • 原文地址:https://blog.csdn.net/m0_61949623/article/details/134088822