每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

Codeforces Round #763 (Div. 2)C

Codeforces Round #763 (Div. 2)C

这个D实在是不会,只能先补了C

C

C

这个题是我们可以选择从3到n

我们可以选择一个d(d>=0&&d<=ai/3),可以把2d给ai-2,那么ai-2+=2d,把d给ai-1,ai-1+=d,我们要找到实现n-2个操作后这些ai中的最小值的最大

对于最小值的最大化这一类问题,我们可以尝试用二分的方式来求解

对于这一题的check

我们可以通过判断x的情况是否符合条件

对于每一个d,我们可以通过贪心来求

ai的最大的一个d为ai/3,最小的为变化了的bi(加上它前面的对它的影响后的值)还需要预留出x,因为我们要保证最小的那一个数一定是x,所以我们需要从后往前遍历

我们最后来判断,如果存在一个数比此时我们给出的最小值x还要小,那么这一个就不符合条件了,return false

#include <iostream>
#include <vector>
using namespace std;
const int maxn=2e5+10;
#define int long long 
int n,t,k;
vector<int>a;
bool check(int x)
{
    vector<int>b=a;
    for (int i=n;i>=3;i--)
    {
        int d=min(a[i]/3,(b[i]-x)/3);
        b[i-2]+=2*d;
        b[i-1]+=d;
    }
    for (int i=1;i<=n;i++)
    {
        if (b[i]<x) return false;
    }
    return true;
}
void solve()
{
    cin>>n;
    a=vector<int>(n+1,0);
    int l=0,r=1e9+10;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
        l=min(l,a[i]);
    }
    int mid,ans;
    while (l<=r)
    {
        mid=(l+r)>>1;
        if (check(mid))
        {
            ans=mid;
            l=mid+1;
        }
        else r=mid-1;
    }
    cout<<ans<<'\n';
    return ;
}
signed main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}
posted @   righting  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示