比赛链接
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],不选就不加进入下一个数。两个分支同时进行。
复杂度,足以通过。
代码:
#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里选择每一条边从哪一个端点开始。把每一种结果取最小值就可以完成。
复杂度
代码
#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;
}