• 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表示匹配的状态,分情况递归求方案数,记得取模。

    太离谱了,补不动啊

  • 相关阅读:
    Mybatis实现(指标状态)的动态sql
    一文让你彻底搞懂AQS(通俗易懂的AQS)
    一文看懂推荐系统:排序04:视频播放建模
    五年谷歌ML Infra生涯,我学到最重要的3个教训
    23.4 Bootstrap 框架5
    9月7日扒面经
    electron+vue3全家桶+vite项目搭建【28】封装窗口工具类【2】窗口组,维护窗口关系
    基于AI算法的5G多接入协同方案及关键技术
    【App自动化测试】(六)移动端自动化中常用的元素定位方式
    新手指南|如何快速参与Moonbeam Ignite
  • 原文地址:https://blog.csdn.net/m0_62289613/article/details/126187419