当前位置:   article > 正文

Educational Codeforces Round 111 (Rated for Div. 2)总结

educational codeforces round 111 (rated for div. 2)

比赛链接

        Dashboard - Educational Codeforces Round 111 (Rated for Div. 2) - Codeforces

A - Find The Array

题意

        给出一个有n个元素的数组,如果元素不为1的话,那么就询问a[i]-1和a[i]-2是否在数组里面。求给出总数和为s,元素个数最少的是多少。

思路

        最优的情况就是1,3,5,...这样可以“消耗”更多的s,进而能保证元素最少,那么可以看出1+3+5=3^2,也就是这样奇数相加是平方和,那么我们就对s进行判断,如果是完全平方数那么就输出它的根号,如果不是那么输出根号加1.

代码

  1. #include<stack>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. #include<cstring>
  8. #include<deque>
  9. #include<vector>
  10. #include<iostream>
  11. #include<map>
  12. #include<set>
  13. #include<iomanip>
  14. #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  15. #define ll long long
  16. using namespace std;
  17. ll GCD(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
  18. const int inf=0x3f3f3f3f;
  19. int n,s,x;
  20. signed main()
  21. {
  22. #ifndef ONLINE_JUDGE
  23. freopen("IO\\in.txt","r",stdin);
  24. freopen("IO\\out.txt","w",stdout);
  25. #endif
  26. IOS
  27. cin>>n;
  28. for (int i=1;i<=n;i++)
  29. {
  30. cin>>s;
  31. int x=sqrt(s);
  32. if (x*x==s) cout<<x<<endl;
  33. else cout<<x+1<<endl;
  34. }
  35. return 0;
  36. }

 

B - Maximum Cost Deletion

题意

        给出一个01序列,我们可以让其中连续的(包括1个)0或者1消除,得到一个新的字符串,可以这样一直下去直到没有。题目除了给出长度和字符串外,还给出了a和b两个变量,每一次操作得分为a*l+bl是这个操作中选取的长度。求最大得分。

思路

        我们对a*l+b进行观察,发现无论截取多少次,对于a*l这一项是永远不变的,主要是看b,我们取的或多或少对b有影响很大。如下图:

        \sum_{i=1}^{num} a*l_i+b\;=\;a*\sum_{i=1}^{num}l_i\,+\,\sum_{i=1}^{num}b\;=\;a*n+num*b

        所以我们看b的范围:

        1)b>0。那么我们想要b越来越多,那么我们就一个一个取,这样得分最大。

        2)b<0。那么我们就希望次数越少越好,我们每次选择连续的,扫一遍得到有多少个01段,如果得出来有cnt块,那么不难证明只需要(cnt/2+1)次可以全部消除。

        3)b=0。随便归为哪一类都行。

代码 

  1. #include<stack>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. #include<cstring>
  8. #include<deque>
  9. #include<vector>
  10. #include<iostream>
  11. #include<map>
  12. #include<set>
  13. #include<iomanip>
  14. #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  15. #define ll long long
  16. using namespace std;
  17. ll GCD(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
  18. const int inf=0x3f3f3f3f;
  19. const int N = 110;
  20. int sum,num[N];
  21. string st;
  22. int n,a,b,cnt,T;
  23. char tmp;
  24. signed main()
  25. {
  26. #ifndef ONLINE_JUDGE
  27. freopen("IO\\in.txt","r",stdin);
  28. freopen("IO\\out.txt","w",stdout);
  29. #endif
  30. IOS
  31. cin>>T;
  32. while (T--)
  33. {
  34. cin>>n>>a>>b>>st;
  35. tmp=st[0];sum=1;cnt=0;
  36. for (int i=1;i<n;i++)
  37. {
  38. if (st[i]!=tmp)
  39. {
  40. if (tmp=='0') tmp='1';
  41. else tmp='0';
  42. num[++cnt]=sum;
  43. sum=1;
  44. }
  45. else
  46. {
  47. sum++;
  48. }
  49. }
  50. num[++cnt]=sum;
  51. //for (int i=1;i<=cnt;i++) cout<<num[i]<<" ";
  52. //cout<<endl;
  53. if (b<0) cout<<b*(cnt/2+1)+a*n<<endl;
  54. else cout<<(a+b)*n<<endl;
  55. }
  56. return 0;
  57. }

C - Manhattan Subarrays

题意

        如果一个区间内有三个点p,q,r能满足d(p,r)=d(p,q)+d(q,r),d(i,j)表示的是i和j之间的曼哈顿距离,那么我们就说这个是“坏的”,如果区间长度为1或2,那么这个是“好的”。求长度为n的给出具体数字的数组,有多少个“好的”区间。

思路

        这个题昨天把我搞自闭了...不知道是属于哪个数据结构,想半天想放弃去吃外卖,但是又不想放弃,去往LIS上想...哎

        郎队在群里讲了一下长度为5的绝对不可能,我发现好有道理!!但是自己那时候没打算打了,今天来补。

        经过题目稍微画图分析,发现这三个点满足非严格递增或递减就不行,所以我们只需要将长度为1,2的加上,长度为3,4取判断是否非严格递增即可。

代码

  1. #include<stack>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. #include<cstring>
  8. #include<deque>
  9. #include<vector>
  10. #include<iostream>
  11. #include<map>
  12. #include<set>
  13. #include<iomanip>
  14. #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  15. #define ll long long
  16. using namespace std;
  17. ll GCD(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
  18. const int inf=0x3f3f3f3f;
  19. const int N = 200007;
  20. int T,a[N],ans,n;
  21. inline bool check(int a,int b,int c)
  22. {
  23. if (a<=b&&b<=c) return false;
  24. if (a>=b&&b>=c) return false;
  25. return true;
  26. }
  27. signed main()
  28. {
  29. #ifndef ONLINE_JUDGE
  30. freopen("IO\\in.txt","r",stdin);
  31. freopen("IO\\out.txt","w",stdout);
  32. #endif
  33. IOS
  34. cin>>T;
  35. while (T--)
  36. {
  37. cin>>n;
  38. for (int i=1;i<=n;i++) cin>>a[i];
  39. ans=n*2-1;
  40. for (int i=1;i<=n-3+1;i++)
  41. {
  42. if (check(a[i],a[i+1],a[i+2])) ans++;
  43. if (i<=n-4+1)
  44. {
  45. int boo=true;
  46. if (!check(a[i],a[i+1],a[i+2])) boo=false;
  47. if (!check(a[i],a[i+1],a[i+3])) boo=false;
  48. if (!check(a[i],a[i+2],a[i+3])) boo=false;
  49. if (!check(a[i+1],a[i+2],a[i+3])) boo=false;
  50. if (boo) ans++;
  51. }
  52. }
  53. cout<<ans<<endl;
  54. }
  55. return 0;
  56. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55054
推荐阅读
相关标签
  

闽ICP备14008679号