atcoder 388 b-e题

b

include<bits/stdc++.h>

using namespace std;

/**

  • @brief 主函数,程序入口

  • @return int 返回值为0,表示程序正常结束
    */
    int main()
    {
    // 输入数组长度n和天数d
    int n, d;
    cin >> n >> d;

    // 定义一个vector,用于存储输入数据
    vector<pair<int, int>> a(n);

    // 输入数组a的元素
    for (int i = 0; i < n; i++)
    cin >> a[i].first >> a[i].second;

    // 遍历每一天
    for (int m = 1; m <= d; m++)
    {
    // 初始化变量k,用于存储当前天的最大收益
    int k = 0;

     // 遍历数组a
     for (const auto& pair : a) 
     {
         // 获取当前元素的两个值
         int t = pair.first;
         int l = pair.second;
    
         // 计算当前元素在当前天的收益,并更新最大收益
         k = max(k, t * (l + m));
     }
    
     // 输出当前天的最大收益
     cout << k << endl;
    

    }

    // 返回0,表示程序正常结束
    return 0;
    }

c

include<bits/stdc++.h>

using namespace std;
using ll=long long;

/**

  • @brief 主函数,程序入口

  • @return int 返回值为0,表示程序正常结束
    */
    int main()
    {
    // 输入数组长度n
    int n;
    cin>>n;

    // 定义数组a,用于存储输入数据
    int a[n+1];

    // 输入数组a的元素
    for(int i=1;i<=n;i++)
    cin>>a[i];

    // 初始化左右指针l和r
    int l=1,r=1;

    // 初始化结果变量res
    ll res=0;

    // 遍历数组a
    while(l<=n)
    {
    // 移动右指针r,直到找到第一个不满足条件的元素
    while(r<=n&&a[r]<a[l]*2) r++;

     // 计算以当前左指针l为起点的满足条件的子数组数量
     res+=n-r+1;
    
     // 移动左指针l
     l++;
    

    }

    // 输出结果
    cout<<res<<endl;

    // 返回0,表示程序正常结束
    return 0;
    }

d

include<bits/stdc++.h>

using namespace std;

/**

  • @brief 主函数,程序入口

  • @return int 返回值为0,表示程序正常结束
    */
    int main()
    {
    // 输入数组长度n
    int n;
    cin>>n;

    // 定义两个数组a和b,用于存储输入数据和辅助计算
    vector a(n+1),b(n+1);

    // 输入数组a的元素
    for(int i=1;i<=n;i++)
    cin>>a[i];

    // 初始化变量k,用于累加数组b的元素
    int k=0;

    // 遍历数组a
    for(int i=1;i<=n;i++)
    {
    // 累加数组b的元素
    k+=b[i];
    // 更新数组a的元素
    a[i]+=k;
    // 计算当前元素可以向前移动的最大步数
    int m=min(a[i],n-i);
    // 更新数组a的元素
    a[i]-=m;
    // 更新数组b的元素
    b[i+1]++;
    b[i+m+1]–;
    // 输出数组a的当前元素
    cout<<a[i]<<” “;
    }

    // 返回0,表示程序正常结束
    return 0;
    }

e

include<bits/stdc++.h>

using namespace std;

// 定义数组a和b,用于存储输入数据
int a[1000005],b[1000005];
// 定义变量n,用于存储数组长度
int n;

/**

  • @brief 检查是否存在长度为x的子数组满足条件
  • @param x 子数组的长度
  • @return true 如果存在满足条件的子数组
  • @return false 如果不存在满足条件的子数组
    /
    bool check(int x)
    {
    // 遍历前x个元素
    for(int i=1;i<=x;i++)
    {
    // 如果当前元素的两倍大于对应的后x个元素,则返回false
    if(a[i]
    2>a[n-x+i]) return false;
    }
    // 如果所有元素都满足条件,则返回true
    return true;
    }

/**

  • @brief 主函数,程序入口
  • @return int 返回值为0,表示程序正常结束
    */
    int main()
    {
    // 输入数组长度n
    cin>>n;
    // 输入数组a的元素
    for(int i=1;i<=n;i++) cin>>a[i];
    // 对数组a进行排序
    sort(a+1,a+n+1);
    // 初始化二分查找的左右边界
    int l=0,r=n/2;
    // 二分查找
    while(l<r)
    {
    // 计算中间值
    int mid=l+r+1>>1;
    // 如果中间值满足条件,则更新左边界
    if(check(mid)) l=mid;
    // 否则更新右边界
    else r=mid-1;
    }
    // 输出结果
    cout<<l<<endl;
    // 返回0,表示程序正常结束
    return 0;
    }

来源链接:https://www.cnblogs.com/aijie1/p/18666934

请登录后发表评论

    没有回复内容