• 2022“杭电杯”中国大学生算法设计超级联赛(3)


    Cyber Language 

    输出每个字符串对应的网络语言。

    思路:以空格分段,输出每个空格后的字母大写,注意开头。

    AC Code:

    1. #include
    2. int t;
    3. std::string s;
    4. int main(){
    5. std::cin>>t;
    6. getchar();
    7. while(t--){
    8. getline(std::cin,s);
    9. std::cout<<(char)(s[0]+'A'-'a');
    10. int len=s.length();
    11. for(int i=1;i
    12. if(s[i]==' '&&i+1<=len-1) std::cout<<(char)(s[i+1]+'A'-'a');
    13. }
    14. std::cout<<'\n';
    15. }
    16. return 0;
    17. }

     os:很好,签到完直接罚坐五小时。

    Package Delivery

    给出每个快递到达的时间和每个快递滞留的时间,必须在滞留的时间段内去拿快递,问这若干个快递最少需要去拿几次可以拿完。

    思路:大佬的思路 统计每个截止日期的物品,对于每个截止日期,若物品个数时k的倍数,那直接无余数的取出;若不是k的倍数,那就找最接近这个日期的物品取走,在此用堆

    AC Code:

    1. #include
    2. typedef std::pair<int,int>PII;
    3. const int N=5e5+5;
    4. int t,n,k;
    5. int main(){
    6. std::ios::sync_with_stdio(false);
    7. std::cin.tie(0);
    8. std::cout.tie(0);
    9. std::cin>>t;
    10. while(t--){
    11. std::cin>>n>>k;
    12. std::vectorin;
    13. std::vector<int>out;
    14. for(int i=1;i<=n;i++){
    15. int l,r;
    16. std::cin>>l>>r;
    17. in.push_back({l,r});
    18. out.push_back(r);
    19. }
    20. std::sort(in.begin(),in.end());
    21. std::sort(out.begin(),out.end());
    22. std::priority_queue<int,std::vector<int>,std::greater<int>>pq;
    23. int cur=0,ans=0;
    24. for(auto it:out){
    25. int cnt=0;
    26. while(curpush(in[cur++].second);
    27. //in[cur].first<=it,筛选在it这天之前已经存在的物品,push的是过期的时间
    28. while(!pq.empty()&&pq.top()==it) cnt++,pq.pop();
    29. //统计截止时间在it当天的物品数
    30. ans+=cnt/k;
    31. if(cnt%k==0) continue;
    32. //当天的物品数量就是k的整数倍
    33. int extra=k-cnt%k;
    34. while(!pq.empty()&&extra--) pq.pop();
    35. //还不到截止时间的物品也在it这天取出,尽量将取出的物品数凑成k的整数倍
    36. //pq是大顶堆,所以优先pop的是截止时间更小更接近it的物品
    37. ans++;
    38. }
    39. std::cout<'\n';
    40. }
    41. return 0;
    42. }

    Two Permutations

    给出两个序列p,q,和长度为2n的序列s,每次选择p或q最左端的数字插入s序列右端,问这两个数列有多少种构造出s的方案,输出答案模998244353。

    思路:考虑DP,即f[i][j]表示到p的第i个数和q的第j个数有多少种构造方案,因为给出的是permutation,则每个数会在构造的序列中出现两次,发现只要记录上次匹配的是哪个序列即可,将两维压成一维,递归求解即可。

    AC Code:

    1. #include
    2. const int N=1e6+5;
    3. const int mod=998244353;
    4. int t,n;
    5. int q[N],p[N],s[N];
    6. int f[N][2];
    7. bool vis[N][2];
    8. int cal(int x,int y,int u){
    9. if(x>n&&y>n) return 1;
    10. if(vis[x+y-1][u]) return f[x+y-1][u];
    11. int res=0;
    12. if(p[x]==s[x+y-1]&&x<=n) (res+=cal(x+1,y,0))%=mod;
    13. if(q[y]==s[x+y-1]&&y<=n) (res+=cal(x,y+1,1))%=mod;
    14. vis[x+y-1][u]=true;
    15. return f[x+y-1][u]=res;
    16. }
    17. int main(){
    18. std::ios::sync_with_stdio(false);
    19. std::cin.tie(0);
    20. std::cout.tie(0);
    21. std::cin>>t;
    22. while(t--){
    23. std::cin>>n;
    24. for(int i=0;i<=(n<<1)+2;i++){
    25. f[i][0]=f[i][1]=0;
    26. vis[i][0]=vis[i][1]=false;
    27. }
    28. for(int i=1;i<=n;i++){
    29. std::cin>>p[i];
    30. }
    31. for(int i=1;i<=n;i++){
    32. std::cin>>q[i];
    33. }
    34. for(int i=1;i<=(n<<1);i++){
    35. std::cin>>s[i];
    36. }
    37. int ans=0;
    38. if(p[1]==s[1]) (ans+=cal(2,1,0))%=mod;
    39. if(q[1]==s[1]) (ans+=cal(1,2,1))%=mod;
    40. std::cout<'\n';
    41. }
    42. return 0;
    43. }

    在cal函数中,x,y分别代表p和q匹配到的位置,u表示匹配的状态,分情况递归求方案数,记得取模。

    太离谱了,补不动啊

  • 相关阅读:
    [鹏城杯 2022]简单的php - 无数字字母RCE+取反【*】
    java计算机毕业设计高校大学生就业系统MyBatis+系统+LW文档+源码+调试部署
    python二级备考(2)-简单应用题
    云原生微服务-理论篇
    LeetCode39- 组合总和
    Hadoop(林子雨慕课课程)
    从数学到算法
    腾讯云数据安全中台保护方案获“首届全国商用密码应用优秀案例”
    互联网Java工程师面试题·Java 总结篇·第七弹
    【buildroot】buildroot使用笔记-03 | 系统初始化的三种方式
  • 原文地址:https://blog.csdn.net/m0_62289613/article/details/126187419