首页 > 其他分享 >USACO 2023-2024 赛季复盘

USACO 2023-2024 赛季复盘

时间:2023-12-17 18:14:41浏览次数:33  
标签:cout int long 2024 solve USACO 2023 include first

【USACO23DEC】Cu 复盘

我先用了一个号打,然后是 T1 TLE * 4,T2 AC,T3 WA * 2。然后后面开了一个号调了一些,喜提阿克。

T1:

首先我们知道,对于 \(a_1\) 每一次是最先吃糖果的。
所以必然有两个情况:

  • 全部给他吃了
  • 吃了一些

首先情况一,我们可以直接特判掉。
剩下情况二,吃了一些没吃完代表:吃了自己的高度,相当于身高乘2。于是我们只需要进行 \(\log 10^9\) 次。然后后面直接 \(O(n)\) 暴力。时间复杂度 \(O(n \log 10^9)\)。

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
#define int long long
int n,m;
int a[N],b[N];
void solve(){
	cin >> n >> m;
	for(int i = 1;i <= n;i++)
		cin >> a[i];
	for(int i = 1;i <= m;i++)
		cin >> b[i];
	
	
	for(int i = 1;i <= m;i++){
		if(b[i] <= a[1]){
			a[1]+=b[i];
			continue;
		} 
		int tmp = 1;
		for(int j = 1;j <= n;j++)
			if(a[j] >= tmp && tmp <= b[i]){
				int t=a[j]+1;
				a[j] += min(a[j]-tmp+1,b[i]-tmp+1);
				tmp = t;
			}
	}
	
	for(int i = 1;i <= n;i++)
		cout<<a[i]<<endl;
	
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}

T2

这是我第一次唯一场切的一道题:

首先我在这题上写了三份代码。原因是我一开始想到分讨,写复杂了。

根据贪心策略,很容易知道:天数越大,奶牛数少,所以我们让天数最多。
然后我们会发现头尾的那个区间如果是 \(x\),那么相当于一个 \(2 \times x - 1\) 的一个普通区间(就是在中间的那种区间)。

所以我们根据处理后的每一个区间的长度进行计算,然后得到了每一个区间最小的天数,也就是我们能够放最多的天数。

所以按照这个去模拟即可。

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n;
int xx=-1,yy=-1;
string s;
vector<pair<int,bool> > v;
int res,ok=1,cnt=0;
int minn = 1e9;

void solve(){
	cin >> n >> s;
	s = ' '+s;
	for(int i = 1;i <= n;i++){
		if(s[i]=='0'){
			if(res)v.push_back({res,ok});
			ok=0;
			res=0;
		}else if(s[i]=='1'){
			res++;cnt++;
		}
	}
	if(res) v.push_back({res,1});
	
	int min2=1e9;
	for(auto it:v){
		if(it.second == 0)min2 = min(min2,it.first);
		else{
			min2 = min(min2,it.first * 2-1);
			if(xx == -1)
				xx = it.first;
			else
				yy = it.first;
		}	
		
	}
	minn=(min2+1)/2;
	int res=0;
	for(auto it:v){
		if(it.first % (minn * 2 - 1) == 0) res+=it.first / (minn * 2 - 1);
		else res+=it.first / (minn * 2 - 1) + 1;
	}
	cout<<res;
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}

T3

高级的说:解个不等式,低级的说:前缀和。

首先,我们先将所有 \(a\) 变换位置到最终应该在的位置。

然后,我们可以通过 \(a_i\) 和 \(a_{i-1}\) 的高度差和速度差,算出来他们之间还需要多久可以符合要求,或者是多久就不符合要求了。拿出草稿纸,自己列举四种情况分别讨论。

如果这个点开始合法,那么在这里进行标记,如果这里开始不合法,也搞一个标记。最后一遍前缀和,结束。

我被这道题卡了很久的问题是一些细节没有处理好。一些边界少加一,多加一的。随后在自己手搓 hack 下,终于过掉啦啊。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+5;
int n,t[N];
struct node{
	int h,a;
}a[N],c[N];
bool cmp(pair<int,bool> a,pair<int,bool> b){
	if(a.first == b.first)
		return a.second > b.second;
	return a.first < b.first;
}
bool check(){
	for(int i = 2;i <= n;i++) if(a[i].h<=a[i-1].h) return false;
	return true;
}
vector<pair<int,bool> > v;
bool solve(){
	v.clear();
	//1为开始,0为结束。
	cin >> n;
	for(int i = 1;i <= n;i++) {
		cin >> a[i].h;
	}
	for(int i = 1;i <= n;i++) {
		cin >> a[i].a;
	}
	for(int i = 1;i <= n;i++) {
		cin >> t[i];
	}
	
	if(n==1){
		cout<<0<<endl;
		return true;
	}
	for(int i = 1;i <= n;i++){
		c[n-t[i]] = a[i];
	}
	for(int i = 1;i <= n;i++){
		a[i] = c[i];
	}
	if(check()){
		cout<<0<<endl;
		return true;
	}
	int res=0;
	for(int i = 2;i <= n;i++){
		if(a[i-1].h > a[i].h) {
			if(a[i].a <= a[i-1].a) {
				return false;
			}
			v.push_back({((a[i-1].h - a[i].h) / (a[i].a-a[i-1].a) + 1),1});
		}else if(a[i-1].h < a[i].h){
			if(a[i].a >= a[i-1].a) v.push_back({0,1});
			else {
				v.push_back({(a[i].h - a[i-1].h) % (a[i-1].a-a[i].a) == 0?(a[i].h - a[i-1].h) / (a[i-1].a-a[i].a):((a[i].h - a[i-1].h) / (a[i-1].a-a[i].a)+1),0});
				res++;
			}
		}else{
			if(a[i].a > a[i-1].a) v.push_back({0,1});
			else return false;
		}
	}
	sort(v.begin(),v.end(),cmp);
//	for(auto it:v){
//		cout<<it.first<<" "<<it.second<<endl;
//	}
	for(int it=0;it < v.size();it++){
		if(v[it].second == 1)
			res++;
		else
			res--;
		
		if(res == n-1 && v[it+1].first != v[it].first) {
			cout<<v[it].first<<endl;
			return true;
		}
	}
	
	
	return false;
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T;
	cin >> T;
	while(T--){
		if(!solve()) cout<<-1<<endl;
	}
	return 0;
}

标签:cout,int,long,2024,solve,USACO,2023,include,first
From: https://www.cnblogs.com/gsczl71/p/17909469.html

相关文章

  • 2023-2024-1 学号20231315第十二周学习总结
    学期:2023-2024-1学号:20231315《计算机基础与程序设计》第十二周学习总结作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1《计算机基础与程序设计》这个作业的目标学习《C语言程序设计》第11章作业正文http......
  • THUPC2024 游记
    大约是进复赛了,那就写个游记吧。队伍名:福州一树开车大队。队伍组成:CTTDay349.64分选手,noip260分的候选队,NOI2022E类铁牌获得者。2023.12.17(初赛)原定策略是我做模3余0的题,lzq做模3余1的题,lhr做模3余2的题。一开场我有点重量级的,对着C做了1h发现不会......
  • THUPC2024初赛 游记
    队伍组成:\(\textJ\color{red}{\text{ijidawang}}\),负责切题;\(\textK\color{red}{\text{8He}}\),负责切题;\(\color{#008000}{\text{x383494}}\),负责拖后腿。Day-1之前组的一个队队长突然没法打比赛,正好看到\(\textJ\color{red}{\text{ijidawang}}\)的队伍缺人,就组了。D......
  • 2023-12-17 每天一练
    LeetCode每日一题746.使用最小花费爬楼梯问题给你一个整数数组cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为0或下标为1的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费......
  • 「比赛游记」THUPC2024 初赛游记
    「比赛游记」THUPC2024初赛游记路上小心ずっと探してた捧げた心臓の在処(我一直在寻找着曾献出的心脏如今何在)本当の想いを教えて夢物語でいいから(告诉我你真实的想法吧纵使如梦话般缥缈)最後になにがしたい?どこに行きたい?(在这最后一刻你还想要做什么?你还想去向何方?)......
  • 2023-2024 20231404高伟光《计算机基础与程序设计》第十二周学习总结
    作业信息作业内容我的班级我的班级作业要求第十二周要求作业目标学习c语言中结构体和基础的数据结构作业正文此博客教材内容总结c语言程序设计第十二章中主要讲了结构体的定义,使用方法还有结构体指针的相关用法.以结构体为基础,衍生讲了联合体和枚......
  • 2023-2024-1 20232329易杨文轩《网络空间安全导论》第六周学习
    学期2023-2024-1学号:20232329《#学期2023-2024-1学号20232329《网络》第六周学习总结》教材学习内容总结教材学习中存在的问题和解决过程问题1:什么是半虚拟化?问题1解决方案:问题2:三种云计算的服务模型有什么区别?问题2解决方案:基于AI的学习参考资料[......
  • THUPC2024记
    算法竞赛打THUPC,就像,只能度过一个相对失败的人生。本来周末理综考得稀烂就急,这下打完THUPC就更急了。不知道啥时候我们队就凑齐了,然后不知道啥时候就直接要比赛了。本来分的是ljc先开ABCD,我开EFGH,lty开IJKLM。结果开场一个“M是签到,但是我不会”给我弄傻了,看一眼题......
  • 2023ISCTF的fry题解及进阶格式化利用
    这题是一个比较好的进阶格式化利用。就是有点繁琐。先惯例checksec一下心脏骤停hhh。没事先分析一下Main函数int__cdeclmain(intargc,constchar**argv,constchar**envp){init(argc,argv,envp);puts("WelcometoISCTF~~~~~~~~~~~~~~~~");puts("Doyouwantto......
  • 2023-2024-1 20232315 《网络空间安全导论》第六周学习总结
    一、教材学习内容总结近一周我预习了第六章应用安全基础,了解了相关知识,下面本章思维导图: 二、教材学习中的问题和解决过程问题一:虚拟化主要有哪些方式解决方法:百度搜索总结答案:虚拟化有很多实现方式,比如:根据虚拟化的程度和级别,有软件虚拟化和硬件虚拟化,全虚拟化和半虚拟......