首页 > 其他分享 >USACO 2023 DEC bronze

USACO 2023 DEC bronze

时间:2024-02-21 15:46:02浏览次数:31  
标签:奶牛 last int 天数 USACO 传染 DEC day bronze

Candy Cane Feast

第一题签到题,依题意模拟即可。注意细节,细节决定成败

Cowntact Tracing 2

贪心。

读题 奶牛传染,每个奶牛每晚传染左边和右边的奶牛。给定一个传染情况,求最开始最少有几个奶牛。

我们记 k 为造成当前传染情况的传染天数。可以知道,传染的天数越多,被传染的牛就越多。所以很容易得到,造成当前局面的天数越多初始的奶牛就越少。那我们只需要求出造成当前局面的最大天数即可。

对于当前的传染情况,我们可以将他们分成一个一个的传染群(如下图)。因为奶牛只能传染其左边和右边的奶牛,所以不同传染群的牛一定不会相互传染。对于每个传染群,我们可以分别求出如果该传染群中只有一个最初传染源时的天数。其中最小天数的就是造成整个传染情况的最大天数。根据我们前面得到的结论,当天数为最大的时最初奶牛的数目就是最小了。

一些实现细节 这些内容请自行使用草稿纸计算

  • 记 len 为传染群的最终牛数
  • 记 day 该传染群的最初牛最少时的传染天数

当day在边界上 $day =len-1$,当day不在边界上 $day =ceil(len/2)-1$

  • 记 s 为一头牛在 k天下传染的牛数
    $s=(1+2k)$ //一头牛一天会传染两头牛(左边和右边),k天传染2*k头。
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6;

char c[N];
int n, pre_list[N], cnt;
int main() {
	scanf("%d", &n);
	int last = -1;
	for (int i = 1; i <= n; i++) {
		cin>> c[i];	
		if(c[i] == '0') last = -1;
		if(c[i] == '1') {
			if(last != -1) pre_list[last] = max(pre_list[last],i-last+1);
			else last = i, pre_list[last] = 1;	
		}
	}
	
	int tmp = max(pre_list[1]-1,0);
	int minday = tmp==0?0x3f3f3f3f:tmp;
	for(int i = 2; i <= n; i++) {
		if(pre_list[i] == 0) continue;
		if(i+pre_list[i]-1 == n) {
			minday = min(minday,pre_list[i]-1);
		}
		else
		minday = min(minday, int(ceil(pre_list[i]*1.0/2)-1));
		
	}
	int ans = 0;
	int k=minday*2+1;
	for(int i = 1; i <= n; i++) {
		ans +=  ceil(pre_list[i]*1.0/k);
	}
	printf("%d",ans);

	return 0;
}

Farmer John Actually Farms

暴力枚举。

读题 给定 $h_i$ , $a_i$ , $t_i$ 。$h_i$为初始高度,$a_i$ 为每天的长高度,$t_i$为限制条件(这个数组包含 0 到 N-1 的全部整数)。

纯暴力
我们记树为 i 枚举其他的数记为j , 对于每个i,j,求出至少要几天,或至多几天内满足 $h_i$ > $h_j$。记为 $day_{i,j}$

	if(h[j]>h[i]){
		if(a[j]>=a[i]) day1[0]++;
		else {
			int tmp=ceil((h[j]-h[i])/(a[i]-a[j]));
			day2[tmp]++;
		}
	}
	if(h[j]==h[i]) {
		if(a[j]>a[i]) day1[1]++;
	}
	if(h[j]<h[i]) {
		if(a[j]>a[i])
			day1[ceil( (h[i]-h[j])/(a[j]-a[i]) )]++;
	}

以上是我自己的想法。考完发现,时间不过,连这题的纯暴力都没写完。考后还发现自己遗漏了关键信息。如果你和我一样只想到 $O(n^2)$ 的写法的话,先别往下看了,回过头看看题目。你是否遗漏了某些信息?是不是有什么东西没有用到?

暴力+优化

关键信息:
他将给你一组由不同整数组成的数组 $t_1$,$\dots$,$t_N$
,这个数组包含 0 到 N-1 的全部整数。

这说明如果存在答案,最终的h[i]之间的数是有严格的大小关系的。如果我们把树按照 $t_i$ 为关键字进行小到大进行排序。最终 $h$ 数组是从小到大进行排序的。
因此我们不需要求出 $day_{i,j}$ 只需要求出$day_{i,i+1}$ 即可。时间复杂度为 $O(n\log n)$ + $O(n)$ 。


考后反思:

  • 题面信息很重要,没思路看题目,思考信息的用处。
  • 细节决定成败,别让调代码占据了你的时间
  • 思路复杂不要谎,先别急,理清思路再写代码

标签:奶牛,last,int,天数,USACO,传染,DEC,day,bronze
From: https://www.cnblogs.com/wh1sky/p/18025340

相关文章

  • P2899 [USACO08JAN] Cell Phone Network G
    原题链接题解一开始我想的是每个节点要么建,要么不建,可是这样一来不好转移,因为有如下情况(黑色代表建站)于是我们换一个角度思考,我们发现一个点要能通网,有三种情况:1.自己建站2.儿子建站3.父亲建站Code#definelllonglong#include<bits/stdc++.h>usingnamespacestd;ve......
  • 洛谷题单指南-递推与递归-P3612 [USACO17JAN] Secret Cow Code S
    原题链接:https://www.luogu.com.cn/problem/P3612题意解读:字符串加长的时候,是先把最后一个字符接上,再拼接其余字符,注意不是翻转,要找第n个字符,就要看字符串加长几次后长度能超过n,然后在加长后的字符串中找第n个字符。解题思路:如果直接通过模拟法,字符串长度太长,且要找的第n个数......
  • USACO Feb 2024 bronze
    挖个坑,今天晚上完成三篇手工翻译。awaT1PalindromeGame赛时100分经典博弈论。手动枚举一下,很容易发现规律,当S为10的倍数时,先手输。手动枚举需注意,不会证明你先别急,枚举要多,才能得出普遍规律(这个傻逼比赛刚开始一直打的是,当S为时10先手输)。需要注意的是S的非常......
  • USACO 2024 February Contest, Bronze Problem 1. Palindrome Game
    1.猜结论2.证明如果\(s<=9\)则\(Bessie\)必赢。如果\(s=10\)则\(Elsie\)必赢。如果\(10<s<=19\)则\(Bessie\)可以减去\(s-10\),使自己必赢。如果\(s=20\)则\(Bessie\)无论如何减去一个回文数都会离\(10\)差一个个位数,\(Elsie\)减去这个个位......
  • USACO24Bronze 游记兼 TJ All in Once
    我没有其他组别的号了。所以只能写Bronze的游记了。如果行的话,下一次我会写Silver的。一开始看了看三道题,T1T2感觉都很不可做,直奔T3。一看T3(Bessie很nb,会各种各样的东西,会科学,会魔法,今天我们发现她会分身术),不就是个二分吗?秒杀。好的,现在搞T1T2,直接《男左女右我......
  • 布莱切利宣言 The Bletchley Declaration 2023年11月1日 学习ing
    ArtificialIntelligence(AI)presentsenormousglobalopportunities:ithasthepotentialtotransformandenhancehumanwellbeing,peaceandprosperity.Torealisethis,weaffirmthat,forthegoodofall, AI shouldbedesigned,developed,deployed,and......
  • P5851 [USACO19DEC] Greedy Pie Eaters P
    n,m较小,同时又是区间问题,可以考虑区间dp。设定\(f[i][j]\)为只在i~j范围内操作的最大贡献,为了将操作表示出来可以设g[k][i][j]为在i~j内操作一次的包括k点最大贡献。通过这些可以推出:\(f[i][j]=max_{k=i}^jf[i][k-1]+f[k+1][j]+g[k][i][j]\),这样一来两边的操作也不会冲突......
  • P4552 [Poetize6] IncDec Sequence
    先看题目,因为在文中可以发现,它有一个区间加区间减的操作,所以我们想到了线段树和差分,而下面题目是要我们自己查找让所有的数字相同的最小步数。因此我们可以将线段树排除,那么来看差分,对于差分而言,所有的数字都相同,就可以看作对于所有的$2\lei\len$而言,$a_i=0$,最后的结果是......
  • P3038 [USACO11DEC] Grass Planting G - 重链剖分
    本题可以说是板题P3384的弱化版,只不过要改的变成了边权边权很好处理,只需要将每个边的边权下放到两端点深度比较深的上面就好了(因为每个点连比它浅的节点必定只有一条边)。那么就将模板改一下就好了代码如下:#include<cstdio>usingnamespacestd;constintN=1e5+5;in......
  • P5155 [USACO18DEC] Balance Beam P
    假设有一个长度为\(L\)的木块。定义\(f_i\)从\(i\)走到\(L\)的概率,有\(f_i=\dfrac{f_{i+1}+f_{i-1}}{2}\)。由\(f_1=0,f_L=1\)可以递推得出\(f_i=\dfrac{i}{L}\)。若一个节点移动的期望收益比当前点停止的收益低,则设这个点为关键点。从\(i\)出发开始移动,期望收益......