Codeforces Round #528 1087 解题报告 A/B/C/D

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值