A.Takahashi san 2
判断一个字符串是否以
san
结尾
using namespace reader;
int main(){string s;cin>>s;if(s[s.length()-1]=='n' and s[s.length()-2]=='a' and s[s.length()-3]=='s'){cout<<"Yes";}else cout<<"No";
}
B.Unvarnished Report
找两个字符串的第一个不相等位置
using namespace reader;
int main(){string a,b;cin>>a>>b;if(a==b){cout<<0<<endl;return 0;}for(int i=0;i<=min(a.length()-1,b.length()-1);++i){if(a[i]!=b[i]){cout<<i+1;return 0;}}cout<<min(a.length(),b.length())+1;
}
C.Separated Lunch
将序列分成 \(A,B\) 两组,最小化两者较大值
让我想起一场古早时期涛哥保龄的模拟赛,好像是因为贪心贪假了喜保龄
\(N\) 小,搜即可
诶这题不搜怎么做来着,排序后贪心吗
using namespace reader;
#define int long long
int n,ans=0x7fffffff;
int A[21];
void dfs(int now,int a,int b){if(now>n){ans=min(ans,max(a,b));return;}dfs(now+1,a+A[now],b);dfs(now+1,a,b+A[now]);
}
signed main(){cin>>n;for(int i=1;i<=n; ++i){cin>>A[i];}dfs(1,0,0);cout<<ans;
}
D.Laser Marking
又到了一月一度的 ABC D题放构式时间
若干线段,可以直线从线段一头以 \(S\text{ per }s\) 走到另一头,或者以 \(T\text{ per }s\) 在空间内自由移动,求从 \((0,0)\) 经过所有线段的最短时间
发现直接按题意搜就行
pure shit
using namespace reader;
#define int long long
int n,t,s;
struct node{int x,y;
}a[15];
struct edge{int to;long double w;
};
vector<edge>e[15];
long double dist(node a,node b){return sqrtl((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool vis[15];
long double ans=1e9;
void dfs(int s,long double now,int cnt){// cout<<s<<" "<<now<<" "<<cnt<<endl;vis[s]=true;if(s!=0 and s<=n and !vis[s+n]){dfs(s+n,now+dist(a[s],a[s+n])/t,cnt+1);vis[s]=false;return;}if(s!=2*n+1 and s>n and !vis[s-n]){dfs(s-n,now+dist(a[s],a[s-n])/t,cnt+1);vis[s]=false;return;}for(edge i:e[s]){if(!vis[i.to]){dfs(i.to,now+i.w,cnt+1);}}if(cnt==2*n){ans=min(ans,now);}vis[s]=false;
}
signed main(){scanf("%lld %lld %lld",&n,&s,&t);for(int i=1;i<=n;++i){scanf("%lld %lld %lld %lld",&a[i].x,&a[i].y,&a[i+n].x,&a[i+n].y);}for(int i=1;i<=2*n;++i){for(int j=1;j<=2*n;++j){if(i!=j and i!=j+n and i+n!=j){e[i].push_back({j,dist(a[i],a[j])/s});}}}for(int i=1;i<=2*n;++i){e[2*n+1].push_back({i,dist({0,0},a[i])/s});}dfs(2*n+1,0,0);printf("%.20Lf",ans);
}