【题解】241005ABC374

A:判断是不是特定字符结尾

void solve() {
	string s;
	cin >> s;
	if(s.size() <3){
		No;
	}
	else{
		string str = s.substr(s.size()-3,3);
		if(str == "san"){
			Yes;
		}
		else No;
	}
}

B:判断两个字符串从第几个字符开始不同,如果相同输出0

void solve() {
	string sa,sb;
	cin >> sa >> sb;
	if(sa == sb){
		cout << 0 << endl;
		return;
	}
	int lena = sa.size(),lenb = sb.size();
	int cnt = 1;
	while(lena && lenb){
		if(sa[cnt-1]!=sb[cnt-1]){
			cout << cnt << endl;
			return;
		}
		cnt++;
	}
	if(lena||lenb)cout << cnt+1<<endl;
}

C:将给定的一列数分成两对,求两对最小的差

思路:发现数据范围是20可以接受递归,每次把当前数加入到a,b其中之一然后往下搜索即可;

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n ;
	cin >> n;
	vector<int> a(n + 1);
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	int ans = 0x3f3f3f3f;
	function<void(int, int, int)>dfs  = [&](int x, int p, int q) {
		if ( x == n + 1) {
			ans = min(ans, max(p, q));
			return ;
		}
		dfs(x + 1, p + a[x], q);
		dfs(x + 1, p, q + a[x]);
	};
	dfs(1, 0, 0);
	cout << ans << endl;
	return 0;
}

D:最多六条线段,6! * pow(2,6)  ≈ 50000 ,可以用dfs

#include<bits/stdc++.h>
using namespace std;
bool fl[10];
double ans=DBL_MAX;
int n,s,t,a[10],b[10],c[10],d[10];
double get(int x,int y,int a,int b){return sqrt((x-a)*(x-a)+(y-b)*(y-b));}
void dfs(int now,int x,int y,double sum){
    if(now>n)  return ans=min(ans,sum),void();
    for(int i=1;i<=n;i++){
        if(fl[i])  continue;
        fl[i]=1;
        dfs(now+1,a[i],b[i],get(x,y,c[i],d[i])/s+get(a[i],b[i],c[i],d[i])/t+sum);
        dfs(now+1,c[i],d[i],get(x,y,a[i],b[i])/s+get(a[i],b[i],c[i],d[i])/t+sum);
        fl[i]=0;
    }
}
int main(){
    scanf("%d%d%d",&n,&s,&t);
    for(int i=1;i<=n;i++)  scanf("%d%d%d%d",a+i,b+i,c+i,d+i);
    dfs(1,0,0,0),printf("%.9lf\n",ans);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值