WHUST 2016 Individual Contest 1

【本文写于2016-08-03,现在从hexo博客搬运过来】

Problem A CodeForces 489A SwapSort
Problem B CodeForces 489D Unbearable Controversy of Being
Problem C CodeForces 489E Hiking
Problem D CodeForces 489F Special Matrices
Problem E CodeForces 489B BerSU Ball
Problem F CodeForces 489C Given Length and Sum of Digits…
Problem G HDU 5680 zxa and set
Problem H HDU 5681 zxa and wifi
Problem I HDU 5676 ztr loves lucky numbers
Problem J HDU 5620 KK’s Steel
Problem K HDU 5623 KK’s Number
Problem L HDU 5619 Jam’s store

A. CodeForces 489A SwapSort

n个数,最多n次交换,问你如何安排这n次交换,使得该序列成为非降序列。
其实是一个朴素的O(n^2)的排序。
从头开始扫每个元素,对每个元素,从序列最后往前扫,统计出最小的,将其与当前元素交换。这就保证,总交换次数一定是不超过n的,也一定能排好序列。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<set>

using namespace std;

#define LL long long
#define ULL unsigned long long
#define mod 100
#define ms(a,x) memset(a,x,sizeof(a));
#define lg2 0.30102999566

const double eps=1e-2;
const double epss=1e-5;
const double pi=acos(-1);
const int maxm = 100000+10;
const int maxn = 100000+10;

int n;
int a[3030];
int ans[3030][2];

int main()
{
    cin>>n;
    for(int i=0; i<n; i++)scanf("%d",&a[i]);
    int now
    int cnt=0;
    for(int i=0; i<n; i++)
    {
        now=a[i];
        int k=i;
        for(int j=i; j<n; j++)
        {
            if(a[j]<now)
            {
                now=a[j];
                k=j;
            }
        }
        if(k==i)continue;
        else
        {
            int tmp=a[k];
            a[k]=a[i];
            a[i]=tmp;
            ans[cnt][0]=i;
            ans[cnt++][1]=k;
        }
    }
    cout<<cnt<<endl;
    for(int i=0; i<cnt; i++)
    {
        cout<<ans[i][0]<<" "<<ans[i][1]<<endl;
    }
}

B. CodeForces 489D Unbearable Controversy of Being

题目定义了一种类似于电桥的图结构,文字描述一下就是a,d两点有两条不同的通路,其中一条上有点b,另一条有另外的点c,题目定义的是这样的结构,我们姑且称之为 桥
现在给你一张图,问你这样的结构一共有多少
猛一看这定义容易把人看蒙。。反正我一开始没看懂。。
后来想了一下。。其实是一个不难的事情。
对于点i,j如果能找到另一点k,使得有链i->j->k,就是一条符合要求的链,如果i到j有m条这样的符合要求的链,那么i,j之间能形成的“桥”就有C(m,2)种。。
点的规模是3000,边的规模最多3w,那暴力一发好了,套用Floyd的思路。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<set>

using namespace std;

#define LL long long

const double eps=1e-2;
const double epss=1e-5;
const double pi=acos(-1);
const int maxm = 100000+10;
const int maxn = 100000+10;

int t;
int n,m;
LL mp[3030][3030]= {0};
LL ans[3030][3030]= {0};

int main()
{
    cin>>n>>m;
    int a,b;
    for(int i=0; i<m; i++)
    {
        cin>>a>>b;
        mp[a][b]++;
    }
    for(int k=1; k<=n; k++)
    {
        for(int i=1; i<=n; i++)
        {
            if(mp[i][k]==0)continue;
            for(int j=1; j<=n; j++)
            {
                ans[i][j]+=(mp[i][k]*mp[k][j]);
            }
        }
    }
    LL sum=0;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            if(i==j)continue;
            sum+=ans[i][j]*(ans[i][j]-1)/2;
        }
    }
    cout<<sum<<endl;
}

C. CodeForces 489E Hiking

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<vector>
#include<algorithm>
#include<cstdlib>
#include<map>
#include<set>

using namespace std;

#define LL long long
#define ULL unsigned long long
#define mod 100
#define ms(a,x) memset(a,x,sizeof(a));
#define lg2 0.30102999566

const double eps=1e-2;
const double epss=1e-5;
const double pi=acos(-1);
const int maxm = 100000+10;
const int maxn = 100000+10;

int n,ll;
int a[1010],b[1010],pre[1010],ans[1010];
double dp[1010];
int main()
{
    scanf("%d%d",&n,&ll);
    for(int i=0; i<n; i++)pre[i]=-1;
    for(int i=0; i<n; i++)
    {
        scanf("%d%d",&a[i],&b[i]);
    }
    double l,r,mid;
    l=0;
    r=1e6;
    while(fabs(l-r)>1e-8)
    {
        mid=(l+r)/2.;
        for(int i=0; i<n; i++)
        {
            dp[i]=sqrt(fabs(a[i]-ll))-mid*b[i];
            for(int j=0; j<i; j++)
            {
                double tmp=dp[j]+sqrt(fabs(a[i]-a[j]-ll))-mid*b[i];
                if(tmp<dp[i])
                {
                    dp[i]=tmp;
                }
            }
        }
        if(dp[n-1]<=1e-3)
        {
            r=mid;
        }
        else l=mid;
    }
    mid=(l+r)/2.;
//printf("%.6lf\n",mid);
//calculate the path.
    for(int i=0; i<n; i++)
    {
        dp[i]=sqrt(fabs(a[i]-ll))-b[i]*mid;
        for(int j=0; j<i; j++)
        {
            double tmp=dp[j]+sqrt(fabs(a[i]-a[j]-ll))-b[i]*mid;
            if(tmp<dp[i])
            {
                dp[i]=tmp;
                pre[i]=j;
            }
        }
    }
    int node=n-1;
    int index=0;
//cout<<"***"<<endl;
    while(node>=0)
    {
        ans[index++]=node;
        node=pre[node];
    }
    for(int i=index-1; i>=0; i--)
    {
        printf("%d ",ans[i]+1);
    }
    cout<<endl;
}

/*
5 9
10 10
20 10
30 1
31 5
40 10
*/

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值