首页 > 其他分享 >「USACO11NOV」 Cow Lineup S

「USACO11NOV」 Cow Lineup S

时间:2023-08-21 17:14:10浏览次数:28  
标签:USACO11NOV Cow cow -- LL long 照片 v1 Lineup

「USACO11NOv1」 Cow Lineup S题解


问题描述

农民约翰雇一个专业摄影师给他的部分牛拍照。由于约翰的牛有好多品种,他喜欢他的照片包含每个品种的至少一头牛。

约翰的牛都站在一条沿线的不同地方, 每一头牛由一个整数位置\(X_i\)以及整数品种编号\(ID_i\)表示。

约翰想拍一张照片,这照片由沿线的奶牛的连续范围组成。照片的成本与规模相当,这就意味着,在一系列照片中的最大和最小\(X\)坐标的差距决定了照片的成本。(一个提示)

请帮助约翰计算最小的照片成本,这些照片中有每个不同的品种的至少一头牛,没有两头牛愿意站在同一个地点的。

输入格式

第\(1\)行:牛的数量\(N(1<=N<=50,000)\);

第\(2\)行:每行包含\(2\)个以空格分隔的正整数\(X_i\)和\(ID_i\);意义如题目描述;

输出格式

输出共一行,包含每个不同品种\(ID\)的照片的最低成本。


分析

因为所有牛都在一条线上,且都有一个不同的坐标(\(X_i\)),所以可以用一个一维数组存,因为\(X_i\)不知道范围,所以用i来定范围方便一些。题目中说了,一头牛有两个信息:\(X_i\)坐标和\(ID_i\)品种,所以用一个结构体数组来存储每一头牛的信息

#define LL long long
struct COW{
    LL x,d;//x是坐标,d是品种,避免爆炸开long long
}cow[50005];

因为输入坐标时是乱的,使用双指针需要一个有序的序列,所以要对它排序,题目中要求在原序列中选取一段区间,所以要用\(X_i\)排序,用map<LL,LL> v1记录\(ID_i\)的头数

#define LL long long
map<LL,LL> v1,v2;//v11的作用后面讲
bool cmp(COW a,COW b){
    return a.x<b.x;
}
scanf("%d",&n);
for (LL i=1;i<=n;++i){
    scanf("%lld %lld",&cow[i].x,&cow[i].d);
    v1[cow[i].d]++;
    v2[cow[i].d]++;
}
sort(cow+1,cow+n+1,cmp);

再看方法,因为要求最少几头牛,且每个品种至少一头,所以就要尽量减少每一个品种的头数,只要每个种类的头数\(>=1\)就可以了,题目中提示:照片的成本与规模相当,这就意味着,在一系列照片中的最大和最小\(X\)坐标的差距决定了照片的成本。所以只要把子序列的左边界(l)和右边界(r)求出来就可以了(就是双指针嘛)

LL l=1,r=n;
while (v1[cow[l].d]!=1){
   v1[cow[l].d]--;
   ++l;
}//缩减左边界
while (v1[cow[r].d]!=1){
   v1[cow[r].d]--;
   --r;
}//缩减右边界
LL first=cow[r].x-cow[l].x;//得到答案

但是,有时先缩减左边界和先缩减右边界得到的答案不一样(你猜我怎么知道的),所以应该重复一次,避免漏掉更小的情况,得到的两个答案中的最小值就是最终答案,因为v1在第一次缩减就已经变了,第二次没法用了,所以在开头就再设一个v2,给第二次用

LL l=1,r=n;
while (v1[cow[l].d]!=1){
    v1[cow[l].d]--;
    ++l;
}//缩减左边界
while (v1[cow[r].d]!=1){
    v1[cow[r].d]--;
    --r;
}//缩减右边界
LL fir=cow[r].x-cow[l].x;//得到第一个答案
l=1;
r=n;
while (v2[cow[r].d]!=1){
    v2[cow[r].d]--;
    --r;
}//缩减右边界
while (v2[cow[l].l]!=1){
    v2[cow[l].d]--;
    ++l;
}//缩减左边界
LL sec=cow[r].x-cow[l].x;//得到第二个答案
printf("%lld",min(fir,sec));

Code:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
LL n, l, r, fir, sec;
struct node{
    LL x, d;
} cow[60005];
bool cmp(node a, node b){
    return a.x < b.x;
}
map<LL, LL> v1,v2;
int main(){
    scanf("%lld", &n);
    for (LL i = 1; i <= n; i++){
        scanf("%lld%lld", &cow[i].x, &cow[i].d);
        v1[cow[i].d]++;
        v2[cow[i].d]++;
    }
    sort(cow + 1, cow + 1 + n, cmp);
    l=1,r=n;
    while (v1[cow[r].d] != 1){
        v1[cow[r].d] -= 1;
        r--;
    }
    while (v1[cow[l].d] != 1){
        v1[cow[l].d] -= 1;
        l++;
    }
    fir = cow[r].x - cow[l].x;
    l = 1, r = n;
    while (v2[cow[l].d] != 1){
        v2[cow[l].d]--;
        l++;
    }
    while (v2[cow[r].d] != 1){
        v2[cow[r].d]--;
        r--;
    }
    sec = cow[r].x - cow[l].x;
    printf("%lld", min(fir, sec));
    return 0;
}

标签:USACO11NOV,Cow,cow,--,LL,long,照片,v1,Lineup
From: https://www.cnblogs.com/z10h09x11/p/17646523.html

相关文章

  • 北大ACM poj2141 Message Decowding
    MessageDecowdingTimeLimit:1000MS MemoryLimit:65536KTotalSubmissions:10326 Accepted:5672DescriptionThecowsarethrilledbecausethey'vejustlearnedaboutencryptingmessages.Theythinktheywillbeabletousesecretmessagestoplot......
  • P1345 [USACO5.4] 奶牛的电信Telecowmunication 题解
    P1345[USACO5.4]奶牛的电信Telecowmunication题目描述农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流。这些机器用如下的方式发送电邮:如果存在一个由\(c\)台电脑组成的序列\(a_1,a_2,\cdots,a_c\),且\(a_1\)与\(a_2\)相连,\(a_2\)与......
  • 题解 Cow and Snacks
    被黄题创死了2333题目链接首先肯定有一个贪心的想法:尽量使得人们拿的花重复,即尽量使得每个人都拿一束花。当然第一个人必须拿两束。接着思考:如何找出有几个人是必须拿两束花的。其实很简单,当\(A,B\)两人不能通过其他人使得他们的花有联系,比如\(A\)喜欢\(1,2\),\(B\)喜欢......
  • UVA10678 The Grazing Cow 题解
    题目链接思路一道简单模拟题。经过模拟,我们不难发现,牛的活动轨迹是一个椭圆。根据椭圆形面积公式得到\(S=\piab\)。其中,牛可以到的最左边或最右边时\(a=\frac{l}{2}\),距离中心最远时\(b=\frac{\sqrt{l^2-d^2}}{2}\)。注意有多组测试点,每次都应输出结果并换行。......
  • P4183 [USACO18JAN] Cow at Large P 题解
    题意分析我们首先想到,枚举贝茜在\(x\)点,枚举度数大于\(2\)的点为\(y\)。设\(x\)的度数为\(a\),\(y\)的度数为\(b\)。我们首先发现每个\(x\)点都有一个初始的贡献为\(a\)条通往叶子的路径。如果点\(y\)到最近的叶子节点的距离大于到\(x\)的点的距离(农夫不能在......
  • Great Cow Gathering G
    GreatCowGatheringG思路换根dp,TreeDistancesI强化版,同样的先思考单个的,那么对于子树\(u\)对于每一个儿子\(v\)都有:\(f_u=f_v+sum_v*w_{u,v}\)其中\(sum\)是子树大小,而\(w\)则是边的长度,用这种方式可以求出以1为根的答案,然后考虑换根公式,首先要转移到的节点......
  • 「USACO2007JAN」Balanced Lineup 解题报告
    「USACO2007JAN」BalancedLineup传送门挖个坑。。。#include<bits/stdc++.h>usingnamespacestd;intn,q,l,r,f1[50002][30],f2[50002][30],a[50002];voidprework(){for(inti=1;i<=n;i++){f2[i][0]=a[i];f1[i][0]=a[i];}intk=log(n......
  • P6066 Watchcow S
    \(P6066\)\(Watchcow\)\(S\)一、题目描述\(Farmer\)\(John\)有\(N\)个农场(\(2≤N≤10^4\)),这些农场由\(M\)条道路连接(\(1\leqM\leq5\times10^4\))。不保证没有重边。\(Bassie\)从\(1\)号农场开始巡逻,每条路必须从两个方向各走恰好一遍,最后回到\(1\)号农场。请输出一......
  • 需求太多处理不过来?MoSCoW模型帮你
    一、MoSCoW模型是什么MoSCoW模型是在项目管理、软件开发中使用的一种排序优先级的方法,以便开发人员、产品经理、客户对每个需求交付的重要性达成共识。MoSCoW是一个首字母缩略词,代表:M(Musthave):必须有。这些是产品成功的关键任务功能,通常是MVP(最小可行产品)的功能,例如微信的聊天......
  • [刷题笔记] Luogu P2340 [USACO03FALL] Cow Exhibition G
    ProblemSolution乍看可能没有思路。我们注意到本题是牵扯到一头奶牛选or不选的问题,非常自然地想到01背包。接下来我们就尝试将本题背景转换成01背包问题。我们可以将智商转换成容量,情商转换成价值。(当然反过来也可)然后就可以套用01背包板子了:\[f_{i,j}=min(f_{i-1,j},f_{i-1......