Codeforces Round 883 (Div. 3)(集训队加训1)

文章展示了五种C++编程问题的解决方案,涉及暴力枚举、贪心策略、矩阵排序、前缀和计算、相似三角形面积计算和二分查找,展示了不同场景下的算法应用。

A.如果钉子与地面距离大于绳子的长度就必须剪

#include<bits/stdc++.h>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
int a[N],b[N],cl[N];
void Lan(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
	}
	ll ans=0;
	for(int i=1;i<=n;i++){
		if(a[i]>b[i]){
			ans++;
		}
	}
	cout<<ans<<'\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int q;
	cin>>q;
	while (q--) {
		Lan();
	}
	return 0;
}

B.

暴力枚举横竖2个斜

#include<bits/stdc++.h>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e3 + 9;
char a[N][N];
void Lan(){
	for(int i=3;i<=5;i++){
		for(int j=3;j<=5;j++){
			cin>>a[i][j];
		}
	}
	for(int i=3;i<=5;i++){
		for(int j=3;j<=5;j++){
			if(a[i][j]=='.'){
				continue;
			}
			if(a[i][j]==a[i+1][j+1] && a[i][j]==a[i+2][j+2]){
				cout<<a[i][j]<<'\n';
				return;
			}		
			if(a[i][j]==a[i+1][j] && a[i][j]==a[i+2][j]){
				cout<<a[i][j]<<'\n';
				return;
			}
			if(a[i][j]==a[i][j+1] && a[i][j]==a[i][j+2]){
				cout<<a[i][j]<<'\n';
				return;
			}
			if(a[i][j]==a[i-1][j+1] && a[i][j]==a[i-2][j+2]){
				cout<<a[i][j]<<'\n';
				return;
			}
		}
	}
	cout<<"DRAW"<<'\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int q;
	cin>>q;
	while (q--) {
		Lan();
	}
	return 0;
}

C.

贪心一下,然后结构体排序即可

#include<bits/stdc++.h>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e5 + 9;
ll t[N],prefix[N];
struct node{
	ll score,t,index;
}a[N];
bool cmp(node a,node b){
	return (a.score==b.score?(a.t==b.t?a.index<b.index:a.t<b.t):a.score>b.score);//排序
}
void Lan(){
	int n,m,h;
	cin>>n>>m>>h;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>t[j];
		}
		sort(t+1,t+1+m);//在矩阵中每行排序
		for(int j=1;j<=m;j++){
			prefix[j]=prefix[j-1]+t[j];//前缀和
		}
		ll res=0;
		int k;
		for(k=1;k<=m;k++){
			if(prefix[k]>h){
				break;
			}
			res+=prefix[k];
		}
		a[i].score=k,a[i].t=res,a[i].index=i;//存储
	}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++){//找index==1
		if(a[i].index==1){
			cout<<i<<'\n';
			return;
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int q;
	cin>>q;
	while (q--) {
		Lan();
	}
	return 0;
}

D.

先算不重叠的,再用相似三角形算重合面积

#include<bits/stdc++.h>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long double ld;
const int N = 2e5 + 9;
int a[N],diff[N];
void Lan(){
	ld n,d,h;
	cin>>n>>d>>h;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	ld ans=n*d*h/2;
	for(int i=1;i<=n-1;i++){
		if(a[i]+h>a[i+1]){
			diff[i]=a[i]+h-a[i+1];
		}else{
			diff[i]=0;
		}
	}
	for(int i=1;i<=n-1;i++){
		//diff[i]/x=h/d->x*h=d*diff[i];->x=d*diff[i]/h
		if(diff[i]){
			ans-=(d*diff[i]/h)*(diff[i])/2;
		}
	}
	cout<<fixed<<setprecision(6)<<ans<<'\n';
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int q;
	cin>>q;
	while (q--) {
		Lan();
	}
	return 0;
}

E1-E2.

暴力枚举1e6,后面最多到k*k二分即可

#include<bits/stdc++.h>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
int a[N];
set<ll> st;
void Lan(){
	ll n;
	cin>>n;
	if(st.count(n)){
		cout<<"YES"<<'\n';
	}else{
		ll x=sqrt(n);
		if(x>1 && x*(x+1)==n-1){
			cout<<"YES"<<'\n';
		}else{
			cout<<"NO"<<'\n';
		}
	}
}
void init(){
	for(ll i=2;i<=1e6;i++){
		ll x=1+i+i*i;
		ll y=i*i;
		st.insert(x);
		while(1){
			if(1.0*y>1.0*1e18/i){
				break;
			}
			y*=i;
			x+=y;
			if(x>1e18){
				break;
			}
			st.insert(x);
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	init();
	int q;
	cin>>q;
	while (q--) {
		Lan();
	}
	return 0;
}

F.

思路好想的交互,但是写很shi

#include<bits/stdc++.h>
#define eps 1e-5
#define INF 1e9
using namespace std;
typedef long long ll;
const int N = 2e6 + 9;
int a[N],c[N],fzc[N];
/*
	变了就删去不是这个数字的
	等下一次变把不是这个数字的发送即可
	
	不能固定等第2次是否变
	如果第一次变了不变了
	第三次变了第四次不变就会wa
	
*/
void Lan(){
	int n;
	cin>>n;
	for(int i=1;i<=9;i++){//初始化!
		c[i]=0;
		fzc[i]=0;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){//记录现在的数字种类以及数量
		c[a[i]]++;
	}
	cout<<"-"<<" "<<0<<endl;//第一次
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	int keynum=0;//找多的,从少的变到多的
	for(int i=1;i<=n;i++){
		fzc[a[i]]++;
	}
	for(int i=1;i<=9;i++){
		if(fzc[i]>c[i]){
			keynum=i;
			break;
		}
	}
	if(!keynum){
		for(int i=1;i<=9;i++){
			fzc[i]=0;
		}
		cout<<'-'<<" "<<0<<endl;//必然要换了	
		for(int i=1;i<=n;i++){
			cin>>a[i];	
		}
		for(int i=1;i<=n;i++){
			fzc[a[i]]++;
		}
		for(int i=1;i<=9;i++){
			if(fzc[i]>c[i]){
				keynum=i;
				break;
			}
		}
	}
	vector<int> del;//可以删去的数字
	for(int i=1;i<=n;i++){
		if(a[i]!=keynum){
			del.push_back(i);
		}
	}
	cout<<"-"<<" "<<(int)del.size()<<" ";
		for(auto &i : del){
			cout<<i<<" ";
		}
		cout<<endl;
	for(int i=1;i<=9;i++){//清空
		c[i]=0;
		fzc[i]=0;
	}
	//结束上述过程后数组其实只存在一个数字,因此等2轮找不是这个数字的index即可
	for(int i=1;i<=n-(int)del.size();i++){//得到数组只是接受一下回复信息
		cin>>a[i];
	}
	ll ansindex=0;
	for(int i=1;i<=n-(int)del.size();i++){
		if(a[i]!=keynum){
			ansindex=i;
			break;
		}
	}
	if(ansindex){
		cout<<"!"<<" "<<ansindex<<endl;
		return;
	}
	cout<<"-"<<" "<<0<<endl;//这轮结束后必然会有换的
	for(int i=1;i<=n-(int)del.size();i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){//找到对应index
		if(a[i]!=keynum){
			ansindex=i;
			break;
		}
	}
	cout<<"!"<<" "<<ansindex<<endl;
}
int main() {
	// ios::sync_with_stdio(false);
	// cin.tie(0),cout.tie(0);
	int q;
	cin>>q;
	while (q--) {
		Lan();
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值