KEYENCE Programming Contest 2024(AtCoder Beginner Contest 374)A-D题解

比赛链接

A - Takahashi san 2

题目及数据范围:

思路:

读入字符串,检查最后几个字符是不是san。

代码:

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;


signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	string s;
	cin>>s;
	if(s[s.length()-3]=='s' && s[s.length()-2]=='a' && s[s.length()-1]=='n') cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
	return 0;
}

B - Unvarnished Report

题目及数据范围:

思路:

先检查对应位置字符是否相等。之后再看看字符串长度是否相等。按要求模拟。

代码:

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;


signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	string s1;
	string s2;
	cin>>s1>>s2;
	for(int i=0;i<min(s1.length(),s2.length());i++){
		if(s1[i]!=s2[i]){
			cout<<i+1<<endl;
			return 0;
		}
	}
	if(s1.length()!=s2.length()){
		cout<<min(s1.length(),s2.length())+1<<endl;
	} else {
		cout<<0<<endl;
	}
	return 0;
}

C - Separated Lunch

题目及数据范围:

思路:

n<20,考虑搜索。dfs第一个变量代表搜到第几个数,第二个代表选到一组里的人的总数。

后面两个分支。代表前now个数,选不选当前这个。选总数加num[now],不选就不加进入下一个数。两个分支同时进行。

复杂度O\left ( 2^{20} \right ),足以通过。

代码:

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int n;
int num[200005];
int tot=0;
int ans=0x3f3f3f3f3f3f3f3f;

void dfs(int now,int cnt){
	if(now==n+1){
		ans=min(ans,max(cnt,tot-cnt));
		return ;
	}
	dfs(now+1,cnt);
	dfs(now+1,cnt+num[now]);
}

signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>num[i],tot+=num[i];
	dfs(0,0);
	cout<<ans<<endl;
	return 0;
}

D - Laser Marking

题目及数据范围:

思路:
一共就只有六条线,直接爆搜。我这里思路是,用全排列的函数,来枚举画激光的顺序。dfs里选择每一条边从哪一个端点开始。把每一种结果取最小值就可以完成。

复杂度O\left ( n!\times2^{n} \right )

代码

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
int n,t,s;
int shunxu[10];
int xian[10][4];
double ti=99999999.9999;

double dis(int ax,int ay,int bx,int by){
	return sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
}

void dfs(int now,double tot,int lx,int ly){
	if(now==n+1){
		//cout<<tot<<"**"<<endl;
		ti=min(ti,tot);
		return ;
	}
	double nowtime=tot+dis(lx,ly,xian[shunxu[now]][0],xian[shunxu[now]][1])/s;
	nowtime+=dis(xian[shunxu[now]][0],xian[shunxu[now]][1],xian[shunxu[now]][2],xian[shunxu[now]][3])/t;
	//cout<<nowtime<<"**"<<endl;
	dfs(now+1,nowtime,xian[shunxu[now]][2],xian[shunxu[now]][3]);
	nowtime=tot+dis(lx,ly,xian[shunxu[now]][2],xian[shunxu[now]][3])/s;
	nowtime+=dis(xian[shunxu[now]][0],xian[shunxu[now]][1],xian[shunxu[now]][2],xian[shunxu[now]][3])/t;
	//cout<<nowtime<<"**"<<endl;
	dfs(now+1,nowtime,xian[shunxu[now]][0],xian[shunxu[now]][1]);
}


signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>n>>s>>t;
	//cout<<dis(1,3,2,1)<<endl;
	for(int i=1;i<=n;i++) cin>>xian[i][0]>>xian[i][1]>>xian[i][2]>>xian[i][3];
	for(int i=1;i<=n;i++) shunxu[i]=i;
	do{
		dfs(1,0.0,0,0);
	}while(next_permutation(shunxu+1,shunxu+1+n));
	cout<<setprecision(7)<<ti<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值