• Codeforces Round #809 (Div. 2)(A~D2)


    A. Another String Minimization Problem

    给出长度为m的全部为B组成的字符串,给出长度为n的数组a,进行n次操作,第i次可以将a[i]位置的B换成A,也可以将m+1-a[i]处的B换为A,求经过n此操作后字典序最小的字符串。

    思路:暴力,每次替换比较靠前的B,但是若是被替换过了,那就替换靠后的那个。

    AC Code:

    1. #include
    2. const int N=55;
    3. int t,n,m;
    4. int a[N];
    5. char s[N];
    6. bool vis[N];
    7. int main(){
    8. std::ios::sync_with_stdio(false);
    9. std::cin.tie(0);
    10. std::cout.tie(0);
    11. std::cin>>t;
    12. while(t--){
    13. std::cin>>n>>m;
    14. for(int i=1;i<=n;i++){
    15. std::cin>>a[i];
    16. }
    17. memset(vis,0,sizeof(vis));
    18. for(int i=1;i<=m;i++){
    19. s[i]='B';
    20. }
    21. for(int i=1;i<=n;i++){
    22. int pos1=a[i];
    23. int pos2=m+1-a[i];
    24. int min=std::min(pos1,pos2);
    25. if(vis[min]) s[pos1+pos2-min]='A',vis[pos1+pos2-min]=1;
    26. else s[min]='A',vis[min]=1;
    27. }
    28. for(int i=1;i<=m;i++){
    29. std::cout<
    30. }
    31. std::cout<<'\n';
    32. }
    33. return 0;
    34. }

     B. Making Towers

    给出一个颜色序列,第一个放在(0,0)处,接下来的只能放在前一个的上,左,右方向,问对于每一个颜色,最大排成的高度是多少。就是相连的在y轴上的最大距离,例如:

    红色的最大高度为3。

    思路:很显然,当同一个色块之间相距的色块是偶数个时,是可以摞起来的。所以直接用STL的map套vector即可,O(n)的时间复杂度,可以过。

    AC Code:

    1. #include
    2. const int N=1e5+5;
    3. int t,n,m;
    4. int a[N],ans[N];
    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;
    12. for(int i=0;i<=n+1;i++) ans[i]=0;
    13. std::map<int,std::vector<int>>mp;
    14. for(int i=1;i<=n;i++){
    15. std::cin>>a[i];
    16. mp[a[i]].push_back(i);
    17. }
    18. for(auto u:mp){
    19. int len=u.second.size();
    20. if(len==1){
    21. ans[u.first]=1;
    22. continue;
    23. }
    24. if(!len) continue;
    25. int cnt=0,aa=0,last=u.second[0];
    26. for(int i=1;i
    27. if((u.second[i]-last)%2) cnt++,last=u.second[i];
    28. if(i==len-1) aa=std::max(aa,cnt);
    29. }
    30. ans[u.first]=aa+1;
    31. }
    32. for(int i=1;i<=n;i++){
    33. std::cout<" \n"[i==n];
    34. }
    35. }
    36. return 0;
    37. }

     os:看到有佬是DP写的,,,不会DP只会暴力呜呜呜

    C. Qpwoeirut And The City

    定义一个建筑是cool的,即它的高度高于相邻两个建筑的高度。给出连续的建筑物高度,可以增高某些建筑物,现最大化cool建筑的数量,求最少需要加高的高度之和。

    思路:对于奇数个连续建筑物高度,一定是隔一个是cool的,方案一定,直接求和即可;对于偶数个连续建筑物高度,想要最大化cool的数量,一定是连续偶数位置是cool建筑,再连续的奇数位置的是cool建筑,可以利用前缀和,分别求出偶数位置是cool时所需增加的最少高度和,奇数位置是cool时所需增加的最少高度和,扫一遍寻找这个断点,即奇偶分界点即可,找到最小的花费。

    AC Code:

    1. #include
    2. typedef long long ll;
    3. const int N=1e5+5;
    4. int t,n;
    5. int a[N];
    6. ll odd[N],even[N];
    7. int main(){
    8. std::ios::sync_with_stdio(false);
    9. std::cin.tie(0);
    10. std::cout.tie(0);
    11. std::cin>>t;
    12. while(t--){
    13. std::cin>>n;
    14. for(int i=1;i<=n;i++){
    15. std::cin>>a[i];
    16. }
    17. for(int i=2;i
    18. odd[i]=odd[i-1],even[i]=even[i-1];
    19. if(i&1) odd[i]+=std::max({a[i-1]+1-a[i],a[i+1]+1-a[i],0});
    20. else even[i]+=std::max({a[i-1]+1-a[i],a[i+1]+1-a[i],0});
    21. }
    22. if(n&1){
    23. std::cout<-1]<<'\n';
    24. continue;
    25. }
    26. ll res=std::min(odd[n-1],even[n-1]);
    27. for(int i=2;i-2;i+=2){
    28. res=std::min(even[i]+odd[n-1]-odd[i+1],res);
    29. }
    30. std::cout<'\n';
    31. }
    32. return 0;
    33. }

    D1/D2. Chopping Carrots

    D1和D2就只有数据范围不同,直接放hard version,对于easy version一样适用。

    给出a数组和k,数组p的范围是大于等于1,小于等于k,求最小的题中公式。

    思路:学习大佬的思路。对于每一个a[i],虽然p[i]有k个,但是\left \lfloor \frac{a_{i}}{p_{i}} \right \rfloor的取值不会很多,由整除分块的思想,取值的数量是根下a[i]级别的,所以我们用类似整数分块的思路枚举\left \lfloor \frac{a_{i}}{p_{i}} \right \rfloor的取值。可用数组max表示\left \lfloor \frac{a_{i}}{p_{i}} \right \rfloor最小值为i时所有\left \lfloor \frac{a_{i}}{p_{i}} \right \rfloor最大值。对于每个a[i],我们都枚举它的取值x,并记录上一次的取值,就可以用上一次的取值更新max[x+1],因为在整除分块的枚举中x的取值一定是递减的。最后扫描一遍更新答案即可。 

    AC Code:

    1. #include
    2. typedef long long ll;
    3. #define INF 0x3f3f3f3f
    4. const int N=1e5+5;
    5. const int mod=1e9+7;
    6. int t,n,k;
    7. int a[N],max[N];
    8. int main(){
    9. std::ios::sync_with_stdio(false);
    10. std::cin.tie(0);
    11. std::cout.tie(0);
    12. std::cin>>t;
    13. while(t--){
    14. std::cin>>n>>k;
    15. memset(max,0,sizeof(max));
    16. for(int i=1;i<=n;i++){
    17. std::cin>>a[i];
    18. int x=INF;
    19. for(int l=1,r;l<=std::min(k,a[i]);l=r+1){
    20. int t=a[i]/l;
    21. r=a[i]/t;
    22. max[t+1]=std::max(max[t+1],x);
    23. x=t;
    24. }
    25. max[0]=std::max(max[0],x);
    26. }
    27. int ans=INF,maxn=0;
    28. for(int i=0;i<=a[1];i++){
    29. maxn=std::max(maxn,max[i]);
    30. ans=std::min(ans,maxn-i);
    31. }
    32. std::cout<'\n';
    33. }
    34. return 0;
    35. }

    若有错误请指教,谢谢!

  • 相关阅读:
    spring boot 2.7 -> 3.0升级指南
    ip_vs 原理解析 (四)hook 后的开始 NF_INET_LOCAL_OUT
    浅谈数字孪生产业应用与标准----工业软件讲坛第七次讲座
    基于java+SpringBoot+HTML+Mysq+微信小程序+小说阅读网站
    【RocketMQ集群】Linux搭建RocketMQ双主双从集群
    Pandas之DataFrame对象大总结
    【OpenCV】在Linux上使用OpenCvSharp
    「C++」论高精度
    C++ 算法设计与分析 地图着色问题(中国+美国)
    Thinkphp漏洞详解合集
  • 原文地址:https://blog.csdn.net/m0_62289613/article/details/125867551