码迷,mamicode.com
首页 > 其他好文 > 详细

Educational Codeforces Round 92 (Rated for Div. 2)

时间:2020-08-06 13:09:24      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:连续   main   方向   ble   https   思路   端点   scanf   using   

A.LCM Problem

题意:最小公倍数LCM(x,y),处于[l,r]之间,并且x,y也处于[l,r]之间,给出l,r找出x,y; 

思路:里面最小的最小公倍数就是基于l左端点的,而那个最小公倍数就是2*l,直接判断2*l是否小于r

注意:当时看到最小公倍数,题目中提到了一个LCM(9,6)=18,就只想最大公因子、分解因式之类的问题,就想错了方向,wa的第一个是想的最大的数分解因式,结果TLE了。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstdio>
 5 #include<cmath>
 6 #include<cstring>
 7 using namespace std;
 8 int main(){
 9     int t;
10     scanf("%d",&t);
11     while(t--){
12         long long int l,r;
13         scanf("%lld %lld",&l,&r);
14         int flag=0;
15         if(l*2<=r){
16             printf("%lld %lld\n",l,l*2);
17         }else{
18             printf("-1 -1\n");
19         }
20  
21     }
22 }

 B. Array Walk

题意:你的初始分数为a1,当你往左或者右边走的时候总分数就会加上所在位置的分数,不可以连续向左走,现在一共有n个位置,一共走k步,最多向左走z步,问所取得的最大分数是多少

思路:要把这个问题分开来看,你往左走的情况只有:1.往左走一步立即向右一步;2.提供的步数不够满足往左走完再往右走,只能是最后一步往左走一步;遍历找最大值

注意:这题必须用输入输出流的优化,并且定义数组的时候需要在外面,不然数组内放不下这么多数,因为是这样所以在循环内,数组必须每次都重置0再进行计算;

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<cstring>
 6 using namespace std;
 7 const int maxx=2e5+3;
 8 long long int a[maxx],b[maxx],sum[maxx];
 9 int main(){
10     ios::sync_with_stdio(0);
11     cin.tie(0), cout.tie(0);
12     int t;
13     cin>>t;
14     while(t--){
15         int n,k,z;
16         cin>>n>>k>>z;
17         for(int i=1;i<=n;i++){
18             a[i]=0;
19             b[i]=0;
20             sum[i]=0;
21             cin>>a[i];
22         }
23         for(int i=1;i<=n;i++){
24             sum[i]+=sum[i-1]+a[i];
25         }
26         for(int i=2;i<=n;i++){
27             b[i]=a[i]+a[i-1];
28         }
29         long long int summ=sum[k+1];//第一种是一直向右走的,直接就是前缀和
30         for(int i=2;i<=n;i++){//i向右走,并且i是当前向右的位置坐标
31             for(int j=1;j<=z&&j<=k-i+1;j++){//向左走应该小于剩余步数并且小于z
32                 if(j*2<=k-i+1){
33                     summ=max(summ,j*b[i]+sum[i+k-i+1-j*2]);
34                     //i+k-2*j-i+1 是最后的当前位置
35                 }else if(j*2-1<=k-i+1){
36                     summ=max(summ,(j-1)*b[i]+a[i-1]+sum[i]);
37                 }
38             }
39         }
40         cout<<summ<<endl;
41     }
42 }

 C. Good String

题意:字符串有做循环位移和右循环位移两种操作。例如字符串“123456”,如果进行左循环位置后得“234561”,如果进行右循环位移后得“612345”。我们称一个字符串为好的,当且仅当它进行左循环位移和右循环位移后相等。现在给定一个字符串只包含0-9,可以删除字符串中某些字符,要求最少删除多少个字符串可以让字符串边好。

思路:要满足左右循环位移一位后字符串完全相等,那么字符串要么全由一个字符串组成,例如,’111111‘,或者只有两个字符循环出现,例如样例中的“2525252525”。那么我们就可以去构造字符串,然后去判断。只有一个字符的时候只要记录一下每个字符出现的次数即可。如果是两个字符循环出现的话,可以枚举剩下的两个字符,然后去和原字符串匹配。复杂度为10*10*n。

Educational Codeforces Round 92 (Rated for Div. 2)

标签:连续   main   方向   ble   https   思路   端点   scanf   using   

原文地址:https://www.cnblogs.com/bonel/p/13402772.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!