Codeforces Round #645 (Div. 2) 题解 (ABCD) (E一定补!)

https://codeforces.com/contest/1358

A. Park Lighting

输出 \(\lceil \dfrac{ab}2 \rceil\)

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=200010; typedef long long ll;
#define int ll
int T,a,b;
signed main(){
	cin>>T;
	while(T--){
		cin>>a>>b;
		cout<<(a*b+1)/2<<endl;
	} 
	return 0;
}

B. Maria Breaks the Self-isolation

题面真长。排序,然后求 \(a[1]+a[2]+...+a[i]<=i\)\(i\) 的最大值

当然答案要加 \(1\) 因为要算上Maria

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=200010; typedef long long ll;
#define int ll
int T,n,a[N];
signed main(){
	cin>>T;
	while(T--){
		cin>>n;
		repeat(i,0,n)cin>>a[i];
		sort(a,a+n);
		int ans=1;
		repeat(i,0,n)if(a[i]<=i+1)ans=i+2; //我编号从0开始有点不同
		cout<<ans<<endl;
	} 
	return 0;
}

C. Celex Update

怎么说呢……比如要从1走到18,有这么两种走法

右图比左图数字之和刚刚好多了1。这说明一旦出现类似 \(4, 7, 12\) 这样的上三角形拐角,我们可以让它拐下来变成 \(4,8,12\)。这样操作 \((y_2-y_1)(x_2-x_1)\) 次后就彻底找不到这种拐角了,因此答案是 \((y_2-y_1)(x_2-x_1)+1\)

#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=200010; typedef long long ll;
#define int ll
int T,x1,x2,y1,y2;
signed main(){
	cin>>T;
	while(T--){
		cin>>x1>>y1>>x2>>y2;
		cout<<(x2-x1)*(y2-y1)+1<<endl;
	}
	return 0;
}

D. The Best Vacation

最优解的区间的右端点一定一定是某个月的月末(这里的区间左右端点都表示某一天)。小证一下,假设有个右端点不是月末的区间,如果左端点(那一天的拥抱次数,下同)大于右端点就让它向左平移,如果左端点小于右端点就让它向右平移,这样总拥抱次数必定增大,因此结论成立qwq

这样就容易好多,我们枚举每个月的月末,二分查找区间左端点即可(不二分查找应该也可)

我这题fst了,尴尬至极,代码先删了避免误导

猜你喜欢

转载自www.cnblogs.com/axiomofchoice/p/12969835.html