C - String
题目:
给定一个字符串序列,我们可以从中随机选择四个字符(允许选择相同的字符),求您四个字符按(avin)顺序排列的概率。
思路:
计算字符'a','v','i','n'出现的次数,当它们都出现过的时候我们可以求出按照(avin)顺序排列的概率,之后再用它们的最大公约数进行约分就可以了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
string s;
int num_a=0,num_v=0,num_i=0,num_n=0,num=1,ans=0,res;
cin>>s;
for(int i=0;i<n;i++)
{
if(s[i]=='a')
{
num_a++;
}
else if(s[i]=='v')
{
num_v++;
}
else if(s[i]=='i')
{
num_i++;
}
else if(s[i]=='n')
{
num_n++;
}
}
if(num_a>0&&num_v>0&&num_i>0&&num_n>0)
{
ans=num_a*num_v*num_i*num_n;
num=n*n*n*n;
res=__gcd(ans,num);
cout<<ans/res<<"/"<<num/res<<endl;
}
else
{
cout<<ans<<"/"<<num<<endl;
}
}
return 0;
}
D - Traffic
题意:
我们在进行车辆在十字路口行驶的模拟,有n辆车在东西方向行驶,第i辆车在ai时间通过交叉口。还有m辆车在南北方向行驶,第i辆车在时间bi通过十字路口,如果两辆车同时通过十字路口,就会发生交通事故,为了保证车辆安全行驶,所有南北方向行驶的车辆都要等待相同的时间,这样就不会有两辆车相撞,求所有南北车辆的最短的相同等待时间。
思路:
我们要求的是所有南北车辆的相同的等待时间,不是每辆车的等待的时间和,所以我们直接模拟判断在t时间是否可以让所有南北车辆能安全通过就可以了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int a[2005],b[2005];
int main()
{
int n,m;
while(cin>>n>>m)
{
int x,ans=0,flag;
for(int i=0;i<1005;i++)
{
a[i]=0;
}
for(int i=0;i<n;i++)
{
cin>>x;
a[x]=1;
}
for(int i=0;i<m;i++)
{
cin>>b[i];
}
for(int t=0;t<1005;t++)
{
flag=1;
for(int i=0;i<m;i++)
{
if(a[b[i]+t])
{
flag=0;
break;
}
}
if(flag)
{
cout<<t<<endl;
break;
}
}
}
return 0;
}
F - Budget
题目:
我们要将一个浮点数序列的所有元素进行四舍五入,将元素四舍五入后会有一个差异(四舍五入后的数-四舍五入前的数),求所有元素更新所改变的差异和。
思路:
因为我们四舍五入的部分是小数部分所以我们将小数部分记录下来之后单独处理就可以了,因为浮点数会丢失精度,所以我们将小数部分记录下来后转换成整型来计算,之后再控制一下输出格式就可以了。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int a[2005],b[2005];
string ss[2005];
int main()
{
int n;
while(~scanf("%d",&n))
{
int sum=0;
for(int i=1; i<=n; i++)
cin>>ss[i];
for(int i=1; i<=n; i++)
{
int j=ss[i].size();
a[i]=(ss[i][j-1]-'0')+(ss[i][j-2]-'0')*10+(ss[i][j-3]-'0')*100;
}
for(int i=1; i<=n; i++)
{
if(a[i]%10<=4)
sum-=a[i]%10;
else
sum+=(10-a[i]%10);
}
if(sum>0)
{
if(sum<10)
printf("0.00%d\n",sum);
else if(sum<100)
printf("0.0%d\n",sum);
else if(sum<1000)
printf("0.%d\n",sum);
else
{
printf("%d.",sum/1000);
if(sum%1000<10)
printf("00%d\n",sum%1000);
else if(sum<100)
printf("0%d\n",sum%1000);
else
printf("%d\n",sum%1000);
}
}
else if(sum==0)
printf("0.000\n");
else
{
sum*=(-1);
if(sum<10)
printf("-0.00%d\n",sum);
else if(sum<100)
printf("-0.0%d\n",sum);
else if(sum<1000)
printf("-0.%d\n",sum);
else
{
printf("-%d.",sum/1000);
if(sum%1000<10)
printf("00%d\n",sum%1000);
else if(sum<100)
printf("0%d\n",sum%1000);
else
printf("%d\n",sum%1000);
}
}
}
}
H - Class
题目:
我们有两个整数x和y,我们要根据x=a+b,y=a-b计算a*b的值。
思路:
一元一次方程计算一下就可以知道a=(x+y)/2,b=(x-y)/2了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x,y,a,b,ans;
cin>>x>>y;
a=(x+y)/2;
b=(x-y)/2;
ans=a*b;
cout<<ans<<endl;
return 0;
}