Educational Codeforces Round 103 (Div. 2)


Educational Codeforces Round 103 (Div. 2)

https://codeforces.com/contest/1476

A K-divisible Sum

思路

n个数相加能够整除k,求n个数中最大的数最小时的值,其实就是求一下n个数相加能整除k时的和,然后平均给n个数,求出每个数的值,如果还有余数就+1。

Code

#include <iostream>
#include<vector>
using namespace std;
#define ll long long
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ll n,x,y,i;
    cin>>n;
    while(n--){
    cin>>x>>y;
    if(x%y==0){
    cout<<1<<endl;
    continue;    
    }
    if(x<y)
    {
      /* for(i=2;;++i)    //会超时 
      {
          if(x*i>=y){
          cout<<i<<endl;
          break;    
          }
      } */
      cout<<y/x+(y%x>0)<<endl;
    }
    if(x>y)
        cout<<2<<endl;        
}
    return 0;    
}

B. Inflation

思路

就是要保证数组每一个除以其前面所有的元素的和小于等于阈值,如果大于阈值就调整(增加前面的和)到符合阈值,求增加数目的最小值即可。

Code

#include <iostream>
#include<vector>
using namespace std;
#define ll long long
int main() 
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ll n,t,k,flag=0,sum;
    cin>>n;
    while(n--){
        cin>>t>>k;
        vector<ll> p(t);
        p.clear();
        for(int i=0;i<t;++i)
        cin>>p[i];

        sum=p[0];
        ll ans=0;
        for(int i=1;i<t;++i)
        {
            //如果超过阀值,计算出超过多少,并与之前的比较,若大于之前的,则更新数据
             if (p[i] * 100 > k * sum && ans < (p[i] * 100 % k == 0 ? p[i] * 100 / k : p[i] * 100 / k + 1) - sum)
                ans = (p[i] * 100 % k == 0 ? p[i] * 100 / k : p[i] * 100 / k + 1) - sum;

        sum+=p[i]; 
        }
        cout<<ans<<endl;        
    }
    return 0;
}

C. Longest Simple Cycle

没看

D. Journey

题意

就是给长度为n的字符串,L表示向左走 ,R表示向右走 ,问0到n每个点最多可以走几个点。每走一次,字符串各个点方向变一次 。

思路

可以考虑前缀和 ,分为两部分,分别维护两个数组 ,一直向左 ,和一直向右的最远到达数目 , 结果相加就行了。向左时 ,如果为L , 则左一那个点的左边为R的话 ,加上左二那个点的结果 ,因为题目说取反 ,取两次不变 ,所以不影响左二左边的结果。右边同样如此。

Code

#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int maxn = 3e5 + 10 ;
int t , n ;
string s ;
int a[maxn] = {0} ;
int b[maxn] = {0} ;
int c[maxn] = {0} ;

int main(){
    cin >> t ;
    while(t--){
        cin >> n ;
        cin >> s ;
        memset(a , 0 , sizeof(a)) ;
        memset(b , 0 , sizeof(b)) ;             
        memset(c , 0 , sizeof(c)) ;
        for(int i = 0 ; i < n ; i++){
            if(s[i] == 'L')    a[i] = 1 ;        //1代表向左 
            else    a[i] = 2 ;                //2代表向右 
        }
        for(int i = 0 ; i <= n ; i++){        //向左 
            b[i] = 1 ;                        //它本身 
            if(i == 0)    continue ;
            else if(i == 1){
                if(a[i-1] == 1)    b[i]++ ;
            }
            else{
                if(a[i-1] == 1){
                    b[i]++ ;
                    if(a[i-2] == 2)    b[i] += b[i-2] ;
                }
            }
        }
        for(int i = n ; i >= 0 ; i--){        //向右  
            c[i] = 1 ;
            if(i == n)    continue ;
            else if(i == n - 1){
                if(a[i] == 2)    c[i]++ ;
            }
            else{
                if(a[i] == 2){
                    c[i]++ ;
                    if(a[i+1] == 1)    c[i] += c[i+2] ;
                }
            }
        }
        for(int i = 0 ; i <= n ; i++){
        //    cout << "c" << c[i] << " b " << b[i] << endl ; 
            b[i] = b[i] + c[i] - 1 ;        //因为加了两次它本身 ,所以减一次 
            cout << b[i] << " " ;
        }
        cout << endl ;
    }
    return 0 ;
}

又是自闭的一场


文章作者: 再也不会
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 再也不会 !
  目录