【Educational Codeforces Round 108 (Rated for Div. 2)】Codeforces-1519ABCD

开局20分钟就开始罚坐的经典场又来了qaq

A. Red and Blue Beans

使用 m i n ( r , b ) min(r,b) min(r,b)个packet来装 r i r_i ri b i b_i bi,要使得 ∣ r i − b i ∣ ≤ d |r_i-b_i|\leq d ribid,则必有使 m a x ( r , b ) max(r,b) max(r,b)尽可能均分装入 m i n ( r , b ) min(r,b) min(r,b)个packet里面。判断均分后 r i r_i ri b i b_i bi的最大差值是否小于等于d即可。
即判断 ⌈ m a x ( r , b ) m i n ( r , b ) ⌉ \lceil \frac{max(r,b)}{min(r,b)}\rceil min(r,b)max(r,b)是否 ≤ d \leq d d即可。

void solves(){
	int r,b;cin>>r>>b;
	if(r<b) swap(r,b);
	int n=r/b-1+(r%b!=0);
	int d;cin>>d;
	if(n<=d)cout<<"YES\n";
	else cout<<"NO\n";
}

B. The Cake Is a Lie

从(1,1)走到(n,m),只能向下或者向右走,即一定向右走了m-1步,向下走了n-1步。不管怎么走,最后的总权值都是不变的,只是将权值进行拆分重新求和。说的有点抽象,随便感觉一下吧,我也不知道怎么证明。
任选一条路,易推的最后权值n-1+n*(m-1),化简得n*m-1。

void solves(){
	int n,m,k;cin>>n>>m>>k;
	if(k==n*m-1)cout<<"YES\n";
	else cout<<"NO\n";
}

C. Berland Regional

第一眼只想到了o(n* n * nlogn)的sb写法,感觉铁t,然后就溜了…确实应该认真再想想的qaq。
模拟即可,set+前缀和优化一下。

bool cmp(pair<int,int>a,pair<int,int>b){
	return a.second>b.second;
}
void solves(){
	int n;cin>>n;
	vector<pair<int,int>>a(n+7);
	vector<vector<ll>>re(n+7);
	set<ll>st;
	for(int i=0;i<n;++i){
		cin>>a[i].first;
		st.insert(a[i].first);
	}
	for(int i=0;i<n;++i) cin>>a[i].second;
	sort(a.begin(),a.end(),cmp);
	vector<ll>ans(n+7);
	for(int i=0;i<n;++i)re[a[i].first].push_back(a[i].second);
	for(auto it:st){
		int len=re[it].size();
		vector<ll>qian(len+7);
		qian[0]=re[it][0];
		for(int i=1;i<len;++i) qian[i]=qian[i-1]+re[it][i];
		for(int i=1;i<=len;++i){
			ans[i]+=qian[len-1-len%i];
		} 
	}
	for(int i=1;i<=n;++i) cout<<ans[i]<<" ";cout<<endl;
}

D. Maximum Sum of Products

第一眼看见这题只会reverse,感觉铁t,读完题就果断溜了。
先处理一下 a i ∗ b i a_i*b_i aibi的前缀。然后通过枚举反转区间的中点来枚举所有情况,显然,奇数区间和偶数区间的枚举方法是不一样的。

const int N=5e3+7;
ll a[N],b[N],qian[N];
ll ans=0;
int n;
void ji(int x){
	ll res=a[x]*b[x];
	ans=max(ans,res+qian[n]-qian[x]+qian[x-1]);
	for(int l=x-1,r=x+1;l>=1&&r<=n;--l,++r){
		res+=a[r]*b[l]+a[l]*b[r];
		ans=max(ans,res+qian[n]-qian[r]+qian[l-1]);
	}
}
void ou(int x){
	ll res=a[x+1]*b[x]+a[x]*b[x+1];
	ans=max(ans,res+qian[n]-qian[x+1]+qian[x-1]);
	for(int l=x-1,r=x+2;l>=1&&r<=n;--l,++r){
		res+=a[r]*b[l]+a[l]*b[r];
		ans=max(ans,res+qian[n]-qian[r]+qian[l-1]);
	}
}
void solves(){
	cin>>n;
	for(int i=1;i<=n;++i) cin>>a[i];
	for(int i=1;i<=n;++i){
		cin>>b[i];
		qian[i]=qian[i-1]+a[i]*b[i];
	}
	for(int i=1;i<=n;++i) ji(i);
	for(int i=1;i<n;++i) ou(i);
	cout<<ans<<endl;
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值