当前位置:   article > 正文

6月4号总结

6月4号总结

目录

刷题记录(Codeforces Round 916 (Div. 3)A~D)

1.A. Problemsolving Log

2.B. Preparing for the Contest

3.C. Quests

4.D. Three Activities


刷题记录(Codeforces Round 916 (Div. 3)A~D)

1.A. Problemsolving Log

Problem - A - Codeforces

A问题要学1分钟,Z问题要学26分钟,按照这个规律,看字符串问题出现的次数,如果出现次数大于要学的时间,那么意味这解决了这个问题。

下面是AC代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. void solve()
  5. {
  6. ll ans=0;
  7. ll n;
  8. cin>>n;
  9. string s;
  10. cin>>s;
  11. map<char,ll>q;
  12. for(int i=0;i<s.size();i++){
  13. if(q[s[i]]!=-1)
  14. q[s[i]]++;
  15. if(q[s[i]]>=(s[i]-'A'+1)) ans++,q[s[i]]=-1;
  16. }
  17. cout<<ans<<"\n";
  18. }
  19. int main()
  20. {
  21. int t;
  22. cin>>t;
  23. while(t--){
  24. solve();
  25. }
  26. return 0;
  27. }

2.B. Preparing for the Contest

Problem - B - Codeforces

查找兴奋次数,因为有多种答案,我们可以指定一种模式,当消费次数为0次或者n-1次时,直接逆序或者顺序输出1到n,其他情况按照下面这个方式:

举例:n=5

k=1,2 1 5 4 3

k=2,1 2 5 4 3

k=3,1 2 3 5 4

下面是AC代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. void solve()
  5. {
  6. ll n,k;
  7. cin>>n>>k;
  8. if(k==n-1)
  9. {
  10. for(int i=1;i<=n;i++){
  11. cout<<i<<" ";
  12. }
  13. cout<<"\n";
  14. return;
  15. }
  16. if(k==0)
  17. {
  18. for(int i=n;i>=1;i--){
  19. cout<<i<<" ";
  20. }
  21. return;
  22. }
  23. if(k==1)
  24. {
  25. cout<<2<<" "<<1<<" ";
  26. for(int i=n;i>=3;i--){
  27. cout<<i<<" ";
  28. }
  29. cout<<"\n";
  30. return;
  31. }
  32. for(int i=1;i<=k;i++){
  33. cout<<i<<" ";
  34. }
  35. for(int i=n;i>=k+1;i--){
  36. cout<<i<<" ";
  37. }
  38. cout<<"\n";
  39. }
  40. int main()
  41. {
  42. int t;
  43. cin>>t;
  44. while(t--){
  45. solve();
  46. }
  47. return 0;
  48. }

3.C. Quests

Problem - C - Codeforces

题意:题目给出两个数组,a数组为任务第一次完成加的经验,b数组为第2次或者以上完成这个任务所加的经验,并且第i个任务必须i-1个任务完成后才能解锁,一开始时,任务1是可以完成的,k是可以完成的任务次数,求最大经验。

一个公式

就是数学加贪心,每次循环取优的结果,最后答案为最优结果的最大值。

下面是AC代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. ll a[200010],b[200010];
  5. void solve()
  6. {
  7. ll n,k;
  8. cin>>n>>k;
  9. for(ll i=0;i<n;i++) cin>>a[i];
  10. for(ll i=0;i<n;i++) cin>>b[i];
  11. ll ans=0,sum=0,cnt=0;
  12. for(int i=0;i<n;i++){
  13. sum+=a[i];
  14. cnt=max(cnt,b[i]);
  15. k--;
  16. if(k>=0)
  17. ans=max(ans,k*cnt+sum);
  18. }
  19. cout<<ans<<"\n";
  20. }
  21. int main()
  22. {
  23. int t;
  24. cin>>t;
  25. while(t--){
  26. solve();
  27. }
  28. return 0;
  29. }

4.D. Three Activities

Problem - D - Codeforces

需要我们找到三个数组中的都选出来一个数,这三个数之和的最大值,但是这三个数所处的下标都各不相同。

n的范围是1x10^5,所以不能暴力,但是我们需要找出的是最大值,那么我们只需要找到每个数字最大的三个数字的下标,再进行一个三重for循环即可。

下面是AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = 1e5+10;
  4. #define pii pair<int,int>
  5. int a[N];
  6. int b[N];
  7. int c[N];
  8. void solve(){
  9. int n;cin >> n;
  10. for(int i = 1;i <= n;i++)cin >> a[i];
  11. for(int i = 1;i <= n;i++)cin >> b[i];
  12. for(int i = 1;i <= n;i++)cin >> c[i];
  13. int a1 = -1,a2 = -1,a3 = -1;
  14. for(int i = 1;i <= n;i++){
  15. if(a1 == -1 || a[i] > a[a1]){
  16. a3 = a2;
  17. a2 = a1;
  18. a1 = i;
  19. }else if(a2 == -1 || a[i] > a[a2]){
  20. a3 = a2;
  21. a2 = i;
  22. }else if(a3 == -1 || a[i] > a[a3]){
  23. a3 = i;
  24. }
  25. }
  26. int c1 = -1,c2 = -1,c3 = -1;
  27. for(int i = 1;i <= n;i++){
  28. if(c1 == -1 || c[i] > c[c1]){
  29. c3 = c2;
  30. c2 = c1;
  31. c1 = i;
  32. }else if(c2 == -1 || c[i] > c[c2]){
  33. c3 = c2;
  34. c2 = i;
  35. }else if(c3 == -1 || c[i] > c[c3]){
  36. c3 = i;
  37. }
  38. }
  39. int b1 = -1,b2 = -1,b3 = -1;
  40. for(int i = 1;i <= n;i++){
  41. if(b1 == -1 || b[i] > b[b1]){
  42. b3 = b2;
  43. b2 = b1;
  44. b1 = i;
  45. }else if(b2 == -1 || b[i] > b[b2]){
  46. b3 = b2;
  47. b2 = i;
  48. }else if(b3 == -1 || b[i] > b[b3]){
  49. b3 = i;
  50. }
  51. }
  52. vector<int>posA(3);
  53. posA[0] = a1,posA[1] = a2,posA[2] = a3;
  54. vector<int>posB(3);
  55. posB[0] = b1,posB[1] = b2,posB[2] = b3;
  56. vector<int>posC(3);
  57. posC[0] = c1,posC[1] = c2,posC[2] = c3;
  58. int res = 0;
  59. for(int i = 0;i < 3;i++){
  60. for(int j = 0;j < 3;j++){
  61. for(int k = 0;k < 3;k++){
  62. int aa = posA[i],bb = posB[j],cc = posC[k];
  63. if(aa != bb && aa != cc && bb != cc){
  64. res = max(res,a[aa] + b[bb] + c[cc]);
  65. }
  66. }
  67. }
  68. }
  69. cout << res << endl;
  70. }
  71. int main(){
  72. int T;cin >> T;
  73. while(T--){
  74. solve();
  75. }
  76. return 0;
  77. }

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

闽ICP备14008679号