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);
}