1006 String
题意
给一个长度为n字符串 任取4个字符 问取得的字符为avin的概率分数(需化简) 0的话输出0/1
思路
分别记录4个字符出现的次数相乘值sum和nnn*n的值nn 两个数分别除以两个数的gcd(最大公倍数)
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 5005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,m,a[N];
string s;
int main()
{
ios::sync_with_stdio(false);
while(cin>>n)
{
ll na=0,nv=0,ni=0,nn=0;
cin>>s;
for(int i=0;i<n;i++)
{
if(s[i]=='a')
na++;
else if(s[i]=='v')
nv++;
else if(s[i]=='i')
ni++;
else if(s[i]=='n')
nn++;
}
if(na&&nv&&ni&&nn)
{
ll gcd=__gcd(na*nv*ni*nn,n*n*n*n);
cout<<na*nv*ni*nn/gcd<<"/"<<n*n*n*n/gcd<<"\n";
}
else
cout<<"0/1\n";
}
return 0;
}
1007 Traffic
题意
n辆车 每辆车都有一个时间a[]东西方向经过路口 m辆车 每辆车都有一个时间b[]南北方向经过路口 现在如果有两个方向上的车同一时间经过路口时 让南北方向的车等待 问最短等待时间
思路
寻找一个时间p 使得任意b[]+p!=a[] 求p的最小值 暴力求解每个ai,bi的差值并置为1 表明p不能取这些值 在从0开始寻找一个最小的没值1的p值输出
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 5005
#define mod 1000000007
using namespace std;
typedef long long ll;
int n,m,a[N],b[N];
bool p[N];
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>m)
{
memset(p,0,sizeof(p));
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<m;i++)
cin>>b[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i]>=b[j])
{
p[a[i]-b[j]]=1;
}
}
}
for(int i=0;i<=1000;i++)
{
if(!p[i])
{
cout<<i<<endl;
break;
}
}
}
return 0;
}
1008 Rng
题意
先从1-n找一个r 在从1-r找一个l 这样找两次得到两个[l,r]区间 问两个区间相交概率
代码
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod=1e9+7;
ll quick_pow(ll a,ll b)
{
ll ret=1;
while(b)
{
if(b&1) ret=ret*a%mod;
a=a*a%mod;
b=b/2;
}
return ret%mod;
}
int main()
{
ll n;
ll ans1,ans2,ans;
while(cin>>n){
ans1=n+1;
ans2=n*2;
ans=ans1*(quick_pow(ans2,mod-2))%mod;
cout<<ans<<"\n";
}
return 0;
}
1009 Budget
题意
多个使用四舍五入到小数点后 3 位的数字 问累加起来的误差值是多少
思路
判断小数第3位 大于4的就加上四舍五入-本身的值 小于等于4的就减去四舍五入-本身的值
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include <sstream>
#define N 5005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,m;
string s;
double sum;
int main()
{
while(~scanf("%ld",&n))
{
sum=0;
for(int i=0; i<n; i++)
{
cin>>s;
int cnt=s[s.size()-1]-'0';
if(cnt>4)
{
sum+=(10-cnt);
}
else
{
sum-=cnt;
}
}
sum/=1000.0;
printf("%.3f\n",sum);
}
return 0;
}
1010 Worker
题意
有 n 个仓库和 m 个工人。 第 i 个仓库中的任何工人每天都可以处理 ai 订单。问是否存在一种工人分配方法可以满足每个仓库每天处理相同数量的订单。
思路
求出所有仓库的lcm(最小公倍数) 计算每个仓库达到最小公倍数所需要的人数总和sum 如果m%sum=0表示存在分配方法 只需要乘上相应的倍数即可 否则表示没有
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#include<set>
#include <sstream>
#define N 5005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll n,m,a[N];
string s;
ll gcd(ll o,ll p)
{
return p==0?o:gcd(p,o%p);
}
ll lcm(ll o,ll p)
{
return o/gcd(o,p)*p;
}
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>m)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
}
ll ggcd=a[0],llcm=a[0];
for(int i=1;i<n;i++)
{
llcm=lcm(a[i],llcm);
}
ll tr=0;
for(int i=0;i<n;i++)
tr+=llcm/a[i];
if(m%tr==0)
{
cout<<"Yes\n";
ll cnt=m/tr;
for(int i=0;i<n;i++)
{
if(i!=0)
cout<<" ";
cout<<llcm/a[i]*cnt;
}
cout<<"\n";
}
else
cout<<"No\n";
}
return 0;
}
1011 Class
题意
给x,y 已知x=a+b,y=a-b 求a*b
代码
#include<cstdio>
#include<cstring>//memset
#include<iostream>//c++
#include<algorithm>//stl
#include<string>
#define N 5005
#define mod 1000000007
using namespace std;
typedef long long ll;
ll x,y,a,b;
string s;
int main()
{
ios::sync_with_stdio(false);
cin>>x>>y;
cout<<((x+y)/2)*((x-y)/2)<<endl;
return 0;
}