求助 -JT2

学术版

Register_int @ 2023-10-22 22:16:21

rt,不知道为啥挂了 30pts /ll /kk /kel

#include <bits/stdc++.h>

typedef long long ll;

using namespace std;

const int MAXN = 1e5 + 10;

/*
一眼贪心,鉴定为:纯纯的暴力。 
*/

int n, m;

ll ans, x, y, a[MAXN], b[MAXN];

int main() {
//  freopen("road.in", "r", stdin);
//  freopen("road.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for (int i = 2; i <= n; i++) scanf("%lld", &a[i]), a[i] += a[i - 1];
    for (int i = 1; i <= n; i++) scanf("%lld", &b[i]); b[n] = 0;
    for (int i = 2, k = 1; i <= n; i++) {
        if (b[i] >= b[k]) continue; y = a[i] - a[k];
        if (x < y) y -= x, ans += (ll)ceil((long double)y / m) * b[k], x = m - y % m;
        else x -= y; k = i;
    }
    printf("%lld", ans);
}

/*
Register_int AK CSP

orz ZZP
orz MCW
orz CYZ
orz HHX
orz HYT
*/

by Cifera_meow @ 2023-10-22 22:40:03

你的思路是什么?我帮你看一下


by Cifera_meow @ 2023-10-22 22:40:30

我第二题小图灵A了


by zly2009 @ 2023-10-22 22:41:10

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int a[N],v[N];
signed main()
{
//  freopen("road.in","r",stdin);
//  freopen("road.out","w",stdout);
    int n,d;
    cin>>n>>d;
    for(int i=1;i<n;i++)cin>>v[i];
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=2;i<=n;i++)
        if(a[i]>a[i-1])a[i]=a[i-1];
    int ans=0;
    for(int i=1;i<n;i++){
        int m=v[i]/d+(v[i]%d!=0);
        int c=m*d-v[i];
        v[i+1]-=c;
        ans+=a[i]*m;
    }
    cout<<ans;
}

本人 65pts 代码,看了下您的评测记录,貌似您错的点都对了(


by SJZ2010 @ 2023-10-22 22:44:14

AC,可以拿去拍:

#include <cstdio>

typedef long long ll;

const int N = 1e5 + 5;

ll n, d;
ll dis[N], money[N], nxt[N], dis_sum[N], can_dis, ans;

int main()
{
    //freopen("road.in", "r", stdin);
    //freopen("road.out", "w", stdout);
    scanf("%lld %lld", &n, &d);
    ll i, dist, last_m, last_i;
    for (i = 1; i < n; i++)
        scanf("%lld", &dis[i]);
    for (i = 2; i <= n; i++)
        dis_sum[i] = dis_sum[i - 1] + dis[i - 1];   
    for (i = 1; i <= n; i++)
        scanf("%lld", &money[i]);
    nxt[n - 1] = n;
    last_m = money[1];
    last_i = 1;
    for (i = 2; i <= n - 1; i++)
    {
        if (money[i] < last_m)
        {
            nxt[last_i] = i;
            last_i = i;
            last_m = money[i];
        }
    }
    nxt[last_i] = n;
    /*      
    for (i = 1; i <= n; i++)
        printf("%lld ", nxt[i]);
    printf("\n");
    */
    for (i = 1; i < n;)
    {
        dist = dis_sum[nxt[i]] - dis_sum[i];
        ans += (dist - can_dis + d - 1) / d * money[i];
        can_dis += (dist - can_dis + d - 1) / d * d;
        can_dis -= dist;//printf("%lld %lld\n", i, money[i]);
        i = nxt[i];
    }
    printf("%lld\n", ans);
    return 0;
}

by MeetYouAtNOI @ 2023-10-22 23:13:29

一眼浮点数误差吧


|