B:计算得分的期望
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
int T;
int n;
int cmp=0;
int a[10010];
int b[10010];
cin>>T;
while(T--)
{
scanf("%d",&n);
cmp++;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
sort(a,a+n);
sort(b,b+n);
int id1=0;
int id2=0;
double res=0;
for(int i=0;i<n;i++)
{
res+=lower_bound(b,b+n,a[i])-b;
}
printf("Case %d: %.2f\n",cmp,res/n);
}
return 0;
}
E:直接根据牌的数量来计算,直接拿n*0.5就是答案。
#include<iostream>
#include<cstdio>
#include<cstring>
#define iloveu return 0
#define wangxingyi main
using namespace std;
int wangxingyi(){
int t;
cin>>t;
int cs=1;
while(t--)
{
int m;
int a;
cin>>m;
for(int i=-m;i<m;i++)
scanf("%d",&a);
printf("Case %d: ",cs++);
if(m%2==0)printf("%d.00\n",m/2);
else printf("%d.50\n",m/2);
}
iloveu;
}
F:水题
#include<iostream>
#include<cstdio>
#include<cstring>
#define iloveu return 0
#define wangxingyi main
using namespace std;
int wangxingyi(){
int t;
cin>>t;
int cs=1;
int a[11111];
while(t--)
{
int m;
int b;
cin>>m;
int ans=0;
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
for(int i=0;i<m;i++)
{
scanf("%d",&b);
if(b+a[i]>10)ans++;
}
printf("Case %d: %d\n",cs++,ans);
}
iloveu;
}
G:按二进制来分
#include<iostream>
#include<cstdio>
#include<cstring>
#define iloveu return 0
#define wangxingyi main
using namespace std;
int wangxingyi(){
long long er[33];
er[0]=1;
for(int i=1;i<33;i++)
er[i]=2*er[i-1];
int t;
cin>>t;
int cs=1;
while(t--)
{
long long m;
cin>>m;
int js=0;
int zz=0;
while(m>=er[zz])
{
m-=er[zz];
js++;
zz++;
}
if(m>0)
{
js++;
}
cout<<"Case "<<cs++<<": ";
cout<<js<<endl;
}
iloveu;
}
J:题意就是在保证每两个点之间有最短路的情况下,去掉剩下的路,求去掉的路的条数。做法就是用floyd求最短路,在这个过程中记录多余的路。然后拿floyd后的地图与初始地图比较,得到答案。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int M[105][105],MM[105][105];
int n,m;
bool vis[105][105];
int main()
{
int T;
int t=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(M,inf,sizeof(M));
int ans=0;
for(int i=0;i<m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(M[u][v]!=inf)ans++;
if(M[u][v]>w)
{
M[u][v]=w;
M[v][u]=w;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
MM[i][j]=M[i][j];
}
}
memset(vis,false,sizeof(vis));
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(M[i][k]+M[k][j]<=M[i][j])
{
M[i][j]=M[i][k]+M[k][j];
vis[i][j]=true;
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(MM[i][j]==inf)continue;
if(M[i][j]<=MM[i][j]&&vis[i][j])ans++;
}
}
printf("Case %d: %d\n",t++,ans);
}
return 0;
}