您的位置:首页 > 其它

2016 第七届福建省大学生程序设计竞赛

2017-07-19 11:30 501 查看
A.

B.

C.

题意:两人轮流玩卡片,共n*2张,每次随机抽一张,比较大小,赢了的话加一分胜点,求Fat brother的期望胜点。

思路:两人获胜的期望是相等的,所以直接n/2就是结果了

#include<iostream>
#include<cstdio>

using namespace std;

const int N = 2e4+5;
int a
;

int main()
{
int t,n;
cin >> t;
for(int ca = 1;ca <= t;ca++)
{
scanf("%d",&n);
for(int i = 0;i < n*2;i++)
scanf("%d",&a[i]);
printf("Case %d: %.2f\n",ca,0.5*n);

}
return 0;
}


D.

题意:两人轮流玩卡片,每人n张,每次随机抽一张,比较大小,赢了的话加一分胜点,求Fat brother的期望胜点。

思路:排序后,每次二分找位置就行了

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;
const int N = 2e4+5;
int a
,b
;

int main()
{
int t,n;
cin >> t;
for(int ca = 1;ca <= t;ca++)
{
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%d",&a[i]);
for(int i = 0;i < n;i++)
scanf("%d",&b[i]);
printf("Case %d: ",ca);
sort(a,a+n);
sort(b,b+n);
double ans = 0;
for(int i = 0;i < n;i++)
ans += lower_bound(b,b+n,a[i])-b;
printf("%.2f\n",ans/n);
}
return 0;
}


E.

题意:两人轮流玩卡片,每人n张,按照栈的特性放置,每次按顺序抽一张,比较大小,赢了的话加一分胜点,求Fat brother的期望胜点。

思路:直接挨个比大小就行了。

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;
const int N = 2e4+5;
int a
,b
;

int main()
{
int t,n;
cin >> t;
for(int ca = 1;ca <= t;ca++)
{
scanf("%d",&n);
for(int i = 0;i < n;i++)
scanf("%d",&a[i]);
for(int i = 0;i < n;i++)
scanf("%d",&b[i]);
printf("Case %d: ",ca);
int ans = 0;
for(int i = 0;i < n;i++)
if(a[i] + b[i] > 10)
ans++;
printf("%d\n",ans);
}
return 0;
}


F.

G.

题意:你有长度为n的金子,要将其分成若干块(整数),使得小于等于n的所有长度都能凑够(不找零)

思路:

1 2 4 8 16这种的数可以将所有的数覆盖,这个又分别对应数的二进制,所以直接看n的二进制位数就是结果了。

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

int main()
{

int t,n;
cin >> t;
for(int ca = 1;ca <= t;ca++)
{
scanf("%d",&n);
printf("Case %d: ",ca);
int ans = 0;
while(n > 0)
{
ans++;
n >>= 1;
}
printf("%d\n",ans);
}
return 0;
}
//1 2 4 8 16


H.

I.

J.

题意:让你在保证原有各点联通的情况下,求至多可以去掉的边数

思路:100点数,明显floyd。

如果有重边,肯定要去掉;

如果原来直接相连,floyd可以松弛掉,原来的边去掉。

开始以为可以直接用真值floyd,石乐志

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

const int INF = 0x3f3f3f3f;
int  d[105][105];
bool vis[105][105],v[105][105];

void floyd(int n)
{
for(int k = 1;k <= n;k++)
for(int i = 1;i <= n;i++)
for(int j = 1;j <= n;j++)
if(d[i][j] >= d[i][k] + d[k][j])
{
d[i][j] = d[i][k] + d[k][j];
vis[i][j] = true;
}
}
int main()
{
int t,n,m;
cin >> t;
for(int ca = 1;ca <= t;ca++)
{
int ans = 0;
memset(v,false,sizeof(v));
memset(vis,false,sizeof(vis));
memset(d,0x3f,sizeof(d));
scanf("%d%d",&n,&m);
int x,y,s;
while(m--)
{
scanf("%d%d%d",&x,&y,&s);
v[x][y] = v[y][x] = true;
if(d[x][y] < INF)
ans++;
d[x][y] = d[y][x] = min(d[x][y],s);
}
floyd(n);
printf("Case %d: ",ca);
for(int i = 1;i <= n;i++)
for(int j = i+1;j <= n;j++)
if(v[i][j] && vis[i][j])
ans++;

printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐