【本文写于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
*/