A
题意:原始串按照题意方式能给构造出 结果串,给你结果串找出原始串
题解:直接按照题目给的方式逆着来就行,需要注意的是奇数长度和偶数长度构造方式不一样
#include <bits/stdc++.h>
using namespace std;
#define maxn 2000000+5
#define INF 0x3f3f3f3f
typedef long long int ll;
int main()
{
string s;
vector<char>ans;
cin>>s;int n=s.size();
if(n%2==0)
for(int i=0;i<=n/2;i++){
if(i==n/2){
ans.push_back(s[i]);
}
else {
ans.push_back(s[n-i-1]);
ans.push_back(s[i]);
}
}
else for(int i=0;i<=n/2;i++){
if(i==n/2)ans.push_back(s[i]);
else {
ans.push_back(s[i]);
ans.push_back(s[n-i-1]);
}
}
for(int i=n-1;i>=0;i--){
cout<<ans[i];
}
return 0;
}
B
题意:(x div k)⋅(xmodk)=n 给你n和k找出最小的x
题解:x-(x div k)*k =(x mod k)这样就两个方程了,把第二个方程的(x div k)消去,就可以枚举(x mod k)来求x了
#include <bits/stdc++.h>
using namespace std;
#define maxn 2000000+5
#define INF 0x3f3f3f3f
typedef long long int ll;
int main()
{
int n,k;
scanf("%d%d",&n,&k);
int ans=INF;
for(int i=1;i<=1000;i++){
//cout<<i<<endl;
if(n%i!=0)continue;
int x=i+n/i*k;
if((x/k)*(x%k)==n){
ans=min(ans,x);
}
}
cout<<ans<<endl;
return 0;
}
C
题意:让你把三个方块连起来,求最小的覆盖面积
题解:自己想的太麻烦,就看了一下别人的解法 还是别人的优秀
首先求出最小的x 和最大的x 然后按照y排序
中间的按照左右扩散到最小的x和最大的x
上下两个往中间扩散
#include <bits/stdc++.h>
using namespace std;
struct node {
int x,y;
node(){}
node (int a,int b){
x=a,y=b;
}
};
bool cmp (node a,node b){
return a.y<b.y;
}
int main(){
node p[3];
for(int i=0;i<3;i++){
scanf("%d%d",&p[i].x,&p[i].y);
}
int l=min(p[0].x,min(p[1].x,p[2].x));
int r=max(p[0].x,max(p[1].x,p[2].x));
sort(p,p+3,cmp);
vector<node>ans;
for(int i=l;i<=r;i++){
ans.push_back(node(i,p[1].y));
}
for(int i=p[0].y;i<p[1].y;i++){
ans.push_back(node(p[0].x,i));
}
for(int i=p[1].y+1;i<=p[2].y;i++){
ans.push_back(node(p[2].x,i));
}
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++){
cout<<ans[i].x<<" "<<ans[i].y<<endl;
}
}
D
题意:让你把边权分布到每个边上,使得所有的边权和为s,同时使得两个叶子之间的最大路径边权和最小
题解:其实稍微看出来这是个***题了。。但是没敢下狠心猜,其实就是把s均匀的分布到叶子节点上就行了。。。
#include <bits/stdc++.h>
using namespace std;
#define maxn 200000+5
int d[maxn];
int main(){
int n,s;
scanf("%d%d",&n,&s);
for(int i=0;i<n-1;i++){
int u,v;
scanf("%d%d",&u,&v);
d[u]++,d[v]++;
}
int sum=0;
for(int i=1;i<=n;i++){
if(d[i]==1)sum++;
}
printf("%.10f\n",s*2.0/sum);
}