luogu P2943 [USACO09MAR]清理Cleaning Up(dp +类似链表预处理)(思维题)

这是一篇关于USACO竞赛中的一道题目,涉及到动态规划和链表预处理的解题思路。文章介绍了如何处理奶牛对食物偏好的情况,以及在不同食物种类下,农夫约翰如何安排喂食以最小化清洁时间。通过实例展示了如何计算最少的清洁总时间,并给出了AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任重而道远

题目描述

In the good old days, Farmer John served a boring cuisine comprising but a single type of cow food to his N (1 <= N <= 40000) prize dairy cows. Times change. Today he serves the herd a total of M (1 <= M <= N) different types of food (conveniently numbered 1..M).

The cows are picky. Cow i has a single food preference P_i (1 <= P_i <= M) and will eat only that favorite food.

Each day at feeding time FJ converts the barn into a tastefully lit cafeteria. The cows line up outside to enter the cafeteria in order of their previously-mentioned convenient index number.

Unfortunately, with so many types of food, cleaning up afterwards is very time-consuming. If Farmer John is serving K different types of food, it takes him K*K units of time to clean the barn.

To save time, FJ serves the cows in contiguous groups from the line. After each group, he cleans up the barn and sets out the food for the next group (of course, he only sets out food that cows in the any given group will eat). Determine the minimum amount of total time FJ must spend cleaning the barn. Each group consists of the next contiguous group of cows from the line; each cow belongs to exactly one group; and the barn must be cleaned up after every group, including the last one.

输入输出格式

输入格式:

* Line 1: Two space-separated integers: N and M

* Lines 2..N+1: Line i+1 contains a single integer: P_i

输出格式:

* Line 1: A single integer: the minimum amount of time FJ must spend cleaning the barn.

输入输出样例

输入样例#1: 复制

13 4 
1 
2 
1 
3 
2 
2 
3 
4 
3 
4 
3 
1 
4 

输出样例#1: 复制

11 

说明

There are four types of food and thirteen cows in line. The first cow prefers type 1, the second type 2, the third type 1, etc.

The first four groups contain one cow each. The fifth group contains two cows who prefer food #2 (requiring one unit of time). The sixth group contains cows preferring foods 3, 4, 3, 4, 3 (and requires four units of time to clean). The last two groups contain one cow each. The total time is 11.

AC代码:

#pragma optimize GCC ("O2")
#include<bits/stdc++.h>
using namespace std;

const int N = 4e4 + 5;
int p[N], last[N], pre[N], pos[N], nxt[N], cnt[N], dp[N];

int read () {
    int x = 0, f = 0; char c = getchar ();
    while (!isdigit (c)) f |= (c == '-'), c = getchar ();
    while (isdigit (c)) x = x * 10 + c - '0', c = getchar ();
    return f ? -x : x;
}

int main () {
    int n = read (), m = read (), blo = sqrt (n + 0.5);
    for (int i = 1; i <= n; i++) {
        p[i] = read ();
        pre[i] = last[p[i]]; nxt[last[p[i]]] = i;
        last[p[i]] = i; nxt[i] = n + 1;
    }
    memset (dp, 0x7f, sizeof (dp));
    dp[0] = 0;
    for (int i = 1; i <= blo; i++) pos[i] = 1;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= blo; j++) {
            if (pre[i] < pos[j]) cnt[j]++;
            if (cnt[j] > j) {
                while (nxt[pos[j]] < i) pos[j]++;
                pos[j]++, cnt[j]--;
            }
            dp[i] = min (dp[i], dp[pos[j] - 1] + j * j);
        }
    return !printf ("%d", dp[n]);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值