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