首页 > 其他分享 > Codeforces Round 856 (Div. 2)

Codeforces Round 856 (Div. 2)

时间:2023-03-05 20:13:14浏览次数:47  
标签:856 int scoreM Codeforces len mid solve Div include

《C. Scoring Subsequences》

  

 

   这道题有很多解法:二分,双指针等,但是无论哪一种都要知道如下:

    想要得到当k时,最大的分数,那么就会贪心地将后面的数相乘再除

    设长度为len,那么在为k时,长度为len时,max score = (ak*a(k-1)*...*a(k-len+1)/len!

    那么在len取何时,在score最大的情况下,len还是最长的?

  

    这里暴力的话,将len枚举,再计算

    但是会超时

    想一下当len=m与len=m-1的区别

    scoreM=(ak*a(k-1)*...*a(k-m+1)/m!

    scoreM-1=(ak*a(k-1)*...*a(k-m+2)/(m-1)!

    即scoreM-1比scoreM少乘了 a(k-m+1)/m

    如果a(k-m+1)/m>1

      scoreM-1>scoreM

    反之

      scoreM-1<scoreM

    其余类推

    用更数学的方式表示的话就是:

    

    所以在k固定的情况下,对于选取len

    即从len=k开始看到len=1,一旦a[k-len+1]/len<1

    那么接下来的a[k-len+1]/len必定<1,即我们已经得到答案了

  

    但是这样枚举还是会超时,这里提供两种方法

    1.二分法:

      二分枚举len,找到那个临界的len就是答案

      

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
void solve()
{
    int n, a[100002];
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= n; i++)
    {
        int l = 1, r = i, ans = 0;
        while (l <= r)
        {
            int mid = (l + r) >> 1;
            if (a[i - mid + 1] / mid >= 1)
            {
                ans = mid;
                l = mid + 1;
            }
            else
                r = mid - 1;
        }
        cout << ans << " ";
    }
    cout << endl;
}

int main()
{
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

 

 

 

    2.用queue:

 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
void solve()
{
    int n, a[100002];
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    int cnt = 0;
    queue<int> q;
    for (int i = 1; i <= n; i++)
    {
        q.push(a[i]), cnt++;
        while (q.size() != 0 && q.front() < cnt)
            q.pop(), cnt--;
        cout << cnt << " ";
    }
    cout << endl;
}
int main()
{
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

 

 

     

 

 

标签:856,int,scoreM,Codeforces,len,mid,solve,Div,include
From: https://www.cnblogs.com/cilinmengye/p/17181414.html

相关文章

  • LeetCode 29. Divide Two Integers 题解教程 All In One
    LeetCode29.DivideTwoIntegers题解教程AllInOnehttps://leetcode.com/problems/divide-two-integers/description///functiondivide(dividend:number,divis......
  • Codeforces Round 855 (Div
    Problem-E2-UnforgivableCurse(hardversion)给定一个初始字符串s和目标字符串t,我们可以对字符串s进行以下任意次操作:对于位置\(i\),如果\(i+k+1<=s.length()\)......
  • Codeforces Round 855 (Div. 3)
    链接CodeforcesRound855(Div.3)A题这个题先将大写变小写然后将重复元素去除,判断是不是等于meow就可以#include<iostream>#include<algorithm>#include<cstdi......
  • Codeforces Global Round 3
    A   题解:显然就拼一下$a,b$然后再把$c$用完,记得判一下$a=b$的特殊情况。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;consti......
  • CodeForces 1422F Boring Queries
    洛谷传送门CF传送门套路题。考虑根号分治,\(\le\sqrt{V}=447\)的质因子直接暴力ST表维护。对于\(>\sqrt{V}\)的质因子每个数最多有一个。记\(big_i\)为\(a_......
  • Codeforces Round #855 (Div. 3) E1 E2
    E1.UnforgivableCurse(easyversion)https://codeforces.com/contest/1800/problem/E1题目大意:这是这个问题的一个简单版本。在这个版本中,k始终是3。有两个长度为......
  • Codeforces Round 853 (Div. 2)(C,D)
    CodeforcesRound853(Div.2)(C,D)CC题目大意就是给你\(n\)个数,我们可以按顺序得到接下来的\(m\)个序列,每一个操作是对前面一个序列的第\(p\)个数变成\(v\),保证每次变......
  • Codeforces Round #277 (Div. 2) A B
    http://codeforces.com/contest/486/problem/AA.CalculatingFunctiontimelimitpertest1secondm......
  • Codeforces Round #279 (Div. 2) A B C
    http://codeforces.com/contest/490/problem/AA题贪心水题A.TeamOlympiadtimelimitpertest1secondmemorylimitpertest256......
  • Codeforces Round #277.5 (Div. 2) C
    题目: http://codeforces.com/contest/489/problem/CC.GivenLengthandSumofDigits...timelimitpertest1secondmemorylimitper......