您的位置:首页 > 其它

【CF】Codeforces Round #301 (Div. 2) ABCDE

2015-05-02 09:24 363 查看
点击打开链接

A:

求锁转动次数的最小值,每一位都sigma(min(向上转,向下转))

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
string s1,s2;
int main()
{
int n,ans=0;
cin>>n>>s1>>s2;
for(int i=0;i<n;i++)
{
int x,y;
if(s1[i]>s2[i])
{
x=s1[i]-s2[i];
y=s2[i]+10-s1[i];
}
else
{
x=s2[i]-s1[i];
y=s1[i]+10-s2[i];
}
ans+=min(x,y);
}
cout<<ans<<endl;
return 0;
}

B:贪心
N个test 给分 ,已知k个分数,要求N个分数的总分不超过x,分数中位数大于等于y.

维护好中位数,添加1或 y(使增加的分数最小)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int a[1111];
vector<int>t;
int n,k,p,x,y;
int ok(int sum)
{
if(sum<=x&&a[(k+1)/2]>=y)
return 1;
return 0;
}
int main()
{
int sum=0;
cin>>n>>k>>p>>x>>y;
for(int i=1;i<=k;i++)
{
cin>>a[i];
sum+=a[i];
}
sort(a+1,a+1+k);
t.clear();
while(k<n)
{
if(k&1)//ji
{
if(a[(k+1)/2]<y)
{
a[k+1]=y,a[k+2]=y;
t.push_back(y);
t.push_back(y);
sum+=2*y;
}
else if(a[(k+1)/2]>y)
{
a[k+1]=1,a[k+2]=1;
t.push_back(1);
t.push_back(1);
sum+=2;
}
else
{
a[k+1]=1,a[k+2]=y;
t.push_back(1);
t.push_back(y);
sum+=y+1;
}
k+=2;
sort(a+1,a+k+1);
}
else
{
if(a[k/2]<y)
{

t.push_back(y);
a[k+1]=y;
sum+=y;
}
else if(a[k/2]>y)
{
a[k+1]=1;
sum++;
t.push_back(1);
}
else
{
sum++;
a[k+1]=1;
t.push_back(1);
}
k++;
sort(a+1,a+k+1);
}
}
if(ok(sum))
{
for(int i=0;i<t.size();i++)
printf("%d ",t[i]);
return 0;
}
else
printf("-1\n");
return 0;
}

C:bfs
对于走过的点会变成X,要求能在终点是X的时候到终点

当终点是“ . ”的时候就需要判断四周还有无" . " (要走两次)

(起点终点可能重合)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int n,m;
char mp[555][555];
int dd[4][2]={1,0,-1,0,0,1,0,-1};
struct node
{
int x,y;
};
int bfs(int x,int y,int sx,int sy)
{
queue<node>q;
node front;
front.x=x,front.y=y;
q.push(front);
if(x==sx&&y==sy)
mp[x][y]='X';
else
mp[x][y]=0;
while(!q.empty())
{
front=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int dx=front.x+dd[i][0];
int dy=front.y+dd[i][1];
if(dx==sx&&dy==sy&&mp[sx][sy]=='X')
{
printf("YES");
return 0;
}
if(dx<0||dy<0||dx>=n||dy>=m||mp[dx][dy]=='X'||mp[dx][dy]==0) continue;
if(dx==sx&&dy==sy)
{
mp[sx][sy]='X';
}
else mp[dx][dy]=0;
node rear;
rear.x=dx,rear.y=dy;
q.push(rear);
}
}
printf("NO");
return 0;
}
int main()
{
int x1,x2,y2,y1;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>mp[i];
cin>>x1>>y1>>x2>>y2;
x1--,y1--,x2--,y2--;
bfs(x1,y1,x2,y2);
return 0;
}

D:简单概率DP
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <set>
using namespace std;
double dp[111][111][111];
int main()
{
int r,s,p;
cin>>r>>s>>p;
memset(dp,0,sizeof(dp));
dp[r][s][p]=1;
for(int i=r;i>=0;i--)
{
for(int j=s;j>=0;j--)
{
for(int k=p;k>=0;k--)
{
int tmp=i*j+j*k+k*i;
if(tmp==0) continue;
if(j-1>=0)
dp[i][j-1][k]+=i*j*1.0/tmp*dp[i][j][k];
if(k-1>=0)
dp[i][j][k-1]+=j*k*1.0/tmp*dp[i][j][k];
if(i-1>=0)
dp[i-1][j][k]+=k*i*1.0/tmp*dp[i][j][k];
}
}
}
double x=0,y=0,z=0;
for(int i=1;i<=100;i++)
x+=dp[i][0][0],y+=dp[0][i][0],z+=dp[0][0][i];
printf("%.9lf %.9lf %.9lf\n",x,y,z);
return 0;
}
/*
*/E:求逆序数
对于交换过的数重新编号后,求逆序数

还需要 计算没出现过的点的数量(代码中的x,y)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int a[1111];
vector<int>t;
int n,k,p,x,y;
int ok(int sum)
{
if(sum<=x&&a[(k+1)/2]>=y)
return 1;
return 0;
}
int main()
{
int sum=0;
cin>>n>>k>>p>>x>>y;
for(int i=1;i<=k;i++)
{
cin>>a[i];
sum+=a[i];
}
sort(a+1,a+1+k);
t.clear();
while(k<n)
{
if(k&1)//ji
{
if(a[(k+1)/2]<y)
{
a[k+1]=y,a[k+2]=y;
t.push_back(y);
t.push_back(y);
sum+=2*y;
}
else if(a[(k+1)/2]>y)
{
a[k+1]=1,a[k+2]=1;
t.push_back(1);
t.push_back(1);
sum+=2;
}
else
{
a[k+1]=1,a[k+2]=y;
t.push_back(1);
t.push_back(y);
sum+=y+1;
}
k+=2;
sort(a+1,a+k+1);
}
else
{
if(a[k/2]<y)
{

t.push_back(y);
a[k+1]=y;
sum+=y;
}
else if(a[k/2]>y)
{
a[k+1]=1;
sum++;
t.push_back(1);
}
else
{
sum++;
a[k+1]=1;
t.push_back(1);
}
k++;
sort(a+1,a+k+1);
}
}
if(ok(sum))
{
for(int i=0;i<t.size();i++)
printf("%d ",t[i]);
return 0;
}
else
printf("-1\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: