cf 1087A
水题

#include <bits/stdc++.h>
#define cl(a) memset(a,0,sizeof(a))
#define sc(x) scanf("%lld",&x)
#define pt(x) printf("%lld\n",x)
using namespace std;
const int maxn=5e5+50;
typedef long long ll;
const int mod=1e9+7;
const ll inf=1e18;
int main()
{
    string s,ans;
    cin>>s;
    if(s.size()%2)
    {
        int i=s.size()-1;
        int j=0;
        while(i>j)
        {
            ans+=s[j];
            ans+=s[i];
            i--;
            j++;
        }
        if(i==j) ans+=s[i];
    }
    else
    {
        int i=s.size()-1;
        int j=0;
        while(i>j)
        {
            ans+=s[i];
            ans+=s[j];
            i--;
            j++;
        }
    }
    for(int i=ans.size()-1;i>=0;i--)
    {
        cout<<ans[i];
    }

    return 0;
}

codeforces 1087B
水题

#include <bits/stdc++.h>
#define cl(a) memset(a,0,sizeof(a))
#define sc(x) scanf("%lld",&x)
#define pt(x) printf("%lld\n",x)
using namespace std;
const int maxn=5e5+50;
typedef long long ll;
const int mod=1e9+7;
const ll inf=1e18;
int main()
{
    int n,k;
    cin>>n>>k;
    int ans=0x3f3f3f3f;
    for(int i=1;i<k;i++)
    {
        if(n%i==0)
        {
           // cout<<n<<" "<<i<<endl;
            int t= n/i;
            int x = k*t+i;
            ans = min(ans,x);
            //cout<<t<< " "<<x<<endl;
        }
    }
    cout<<ans<<endl;
    return 0;
}

codeforces 1087C
这个题卡了一会儿,原因是忽略他在格子中的条件,单纯想如何通过求路径,计算重复的情况了
事实上,如果在格子中,那么走的方案基本上就是走一个折角。
那么我们只要按照X排序,从a->b 先横着走,再竖着走 从b->c 先竖着走,再横着走,那么就可去掉重复的那些点了;

#include <bits/stdc++.h>
using namespace std;
struct node
{
    int x,y;
};
node a[4];
bool cmp(node a,node b)
{
    if(a.x==b.x)return a.y<b.y;
    return a.x<b.x;

}
vector<node>v;
int vis[1005][1005];
void getpath(node a,node b)
{
    for(int i=a.x; i<=b.x; i++)
    {
        node t;
        t.x=i;
        t.y=a.y;
        if(!vis[t.x][t.y])
            v.push_back(t);
        vis[t.x][t.y]=1;
    }
    if(a.y>=b.y)
    {
        for(int i=a.y; i>=b.y; i--)
        {
            node t;
            t.x=b.x;
            t.y=i;
            if(!vis[t.x][t.y])
                v.push_back(t);
            vis[t.x][t.y]=1;
        }
    }
    else
    {
        for(int i=a.y; i<=b.y; i++)
        {
            node t;
            t.x=b.x;
            t.y=i;
            if(!vis[t.x][t.y])
                v.push_back(t);
            vis[t.x][t.y]=1;
        }
    }
}

void getpath2(node a,node b)
{
    if(a.y>=b.y)
    {
        for(int i=a.y; i>=b.y; i--)
        {
            node t;
            t.x=a.x;
            t.y=i;
            if(!vis[t.x][t.y])
                v.push_back(t);
            vis[t.x][t.y]=1;
        }
    }
    else
    {
        for(int i=a.y; i<=b.y; i++)
        {
            node t;
            t.x=a.x;
            t.y=i;
            if(!vis[t.x][t.y])
                v.push_back(t);
            vis[t.x][t.y]=1;
        }
    }
     for(int i=a.x; i<=b.x; i++)
    {
        node t;
        t.x=i;
        t.y=b.y;
        if(!vis[t.x][t.y])
            v.push_back(t);
        vis[t.x][t.y]=1;
    }
}


int main()
{
    for(int i=1; i<=3; i++)
    {
        cin>>a[i].x>>a[i].y;
    }
    sort(a+1,a+4,cmp);
    getpath(a[1],a[2]);
    getpath2(a[2],a[3]);
    cout<<v.size()<<endl;
    for(int i=0; i<v.size(); i++)
    {
        cout<<v[i].x<<" "<<v[i].y<<endl;
    }
    return 0;
}

codeforces 1087D
要求最小的直径。如果在中间赋予权值,那么任意一条路径都会增加这个权值,那么这个权值与加在叶子节点上的效果是一样的,所以我们只要让所有的叶子结点平分总的权值即可。。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,s;
const int maxn=1e6+60;
int in[maxn];

int main()
{
    scanf("%lld%lld",&n,&s);
    int k =0;
    for(int i=1;i<n;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        in[u]++;
        in[v]++;
    }
    for(int i=1;i<=n;i++)
    {
        if(in[i]==1) k++;
    }
    double ans = s*1.0/k *2.0;
    printf("%.6f\n",ans);
    return 0;
}