当前位置: 代码迷 >> 综合 >> Codeforces D. The Best Vacation (模拟 / 思维) (Round #645 Div.2)
  详细解决方案

Codeforces D. The Best Vacation (模拟 / 思维) (Round #645 Div.2)

热度:66   发布时间:2023-12-22 13:47:47.0

传送门

题意: 一年有n个月,第i月有d[i]天,而一个月的第j天可以拥抱j次。试问选择一年中的哪l连续xt天可以得到最多得拥抱ans?求出最大拥抱值ans。
在这里插入图片描述
思路:

  • 显然若要在某个月中开始选择,那首当其冲得就是月末的那天(贡献值最大)。所有应该从某个月的月末那天开始向前选择连续x天。
  • 首先得预处理sum函数来记录连续i天的拥抱值(题目给出可能达到1e6)
  • 那么我们可以枚举第i月为选择的末月,计算出当前情况的时间拥抱值summ,再与答案ans取个max就行啦。

代码实现:

#include<bits/stdc++.h>
#define endl '\n'
#define null NULL
#define ll long long
#define int long long
#define pii pair<int, int>
#define lowbit(x) (x &(-x))
#define ls(x) x<<1
#define rs(x) (x<<1+1)
#define me(ar) memset(ar, 0, sizeof ar)
#define mem(ar,num) memset(ar, num, sizeof ar)
#define rp(i, n) for(int i = 0, i < n; i ++)
#define rep(i, a, n) for(int i = a; i <= n; i ++)
#define pre(i, n, a) for(int i = n; i >= a; i --)
#define IOS ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int way[4][2] = {
    {
    1, 0}, {
    -1, 0}, {
    0, 1}, {
    0, -1}};
using namespace std;
const int  inf = 0x7fffffff;
const double PI = acos(-1.0);
const double eps = 1e-6;
const ll   mod = 1e9 + 7;
const int  N = 2e5 + 5, M = 1e6 + 5;int n, x, pos ,summ, ans;
int d[N], sum[M];signed main()
{
    IOS;//预处理sum数组for(int i = 1; i <= M; i ++)sum[i] = sum[i - 1] + i;cin >> n >> x;for(int i = 1; i <= n; i ++)cin >> d[i];pos = n;//以i为末月的选择向前枚举for(int i = n; i; i --){
    while(x > 0){
     //只要还有剩余天数科选x -= d[pos]; //先选中第pos月summ += sum[d[pos]]; //把第pos月的贡献加入临时答案if(pos == 1) pos = n; // 若pos到1就首位循环else pos --;}//去掉多选的几天,计算出实际总和,再取个maxans = max(ans, summ - (1 - x) * (-x) / 2); //去掉第i月的贡献,再进入下一个循环(以i - 1为末月的选择)summ -= sum[d[i]];x += d[i];}cout << ans << endl;return 0;
}
  相关解决方案