二天 牛客62场小白月赛"/>
第六十二天 牛客62场小白月赛
A题
大水题
#include<iostream>using namespace std;int h[10010];
int t,n,m,a,k,b;void zhang(int h[])
{while(--m){for(int i=1;i<=n;i++){h[i]+=a;if(h[i]>k) h[i]=b;}}for(int i=1;i<=n;i++){cout<<h[i]<<' ';}
}int main()
{cin>>t;while(t--){cin>>n;for(int i=1;i<=n;i++){cin>>h[i];}cin>>a>>k>>b;cin>>m;zhang(h);cout<<endl;}return 0;
}
B题
这题核心是弄懂为什么只有0.1输出
因为询问的数小于等于数字个数,分为两种情况
1.所有数的和加起来等于询问的数的倍数,余零。
2.因为个数大于要询问的数n,所以和的余数种类要小于个数。所以去掉一个数可以满足所有的余数情况。
#include<iostream>
using namespace std;int t,l,r,m,n;
long long int sum;int main()
{cin>>t;while(t--){cin>>l>>r;sum=1ll*(l+r)*(r-l+1)/2;cin>>m;while(m--){cin>>n;if(sum%n==0) cout<<0;else cout<<1;cout<<endl;}}return 0;
}
C题
先放一段别人代码,这题思路是只要质因子不同两个数组就不同。故分解质因子再比较就可以了。
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100005];
int b[100005];
int mp[1000005];
int main()
{cin>>n;for(int i = 1;i<=n;++i){cin>>a[i];int x = a[i];for(int j = 2;j<=sqrt(x);++j)while(x%j==0){mp[j]++;x/=j;}if(x>1)mp[x]++;}for(int i = 1;i<=n;++i){cin>>b[i];int x = b[i];for(int j = 2;j<=sqrt(x);++j)while(x%j==0){if(mp[j]){cout<<"No\n";return 0;}x/=j;}if(x>1){if(mp[x]){cout<<"No\n";return 0;} }}cout<<"Yes\n";return 0;
}
可恶啊,为什么我写的不行啊,甚至用了线性筛法,双指针结果还是不行。明天继续,把剩下题肝完。
#include<iostream>
using namespace std;
const int N=1010;
int n,cnt=0,cnt1=0,cnt2=0,prime[10000],a[N],b[N],c[N];
bool flag=true,st[10000],st1[N];
void primes()
{
for(int i=2;i<=100000;i++)
{
if(!st[i]) prime[cnt++]=i;
for(int j=0;j<=100000/i;j++)
{
st[i*prime[j]]=true;
if(i%prime[j]==0) break;
}
}
}
void judge(int x)
{
if(x==1) flag=false;
for(int i=0;i<cnt;i++)
{
if(x%prime[i]==0)
{
if(!st1[prime[i]])
{
c[cnt1++]=prime[i];
st1[i]=true;
}
}
}
}
int main()
{
cin>>n;
primes();
for(int i=1;i<=n;i++)
{
cin>>a[i];
judge(a[i]);
}
cnt2=cnt1;
for(int i=1;i<=n;i++)
{
cin>>b[i];
judge(b[i]);
}
for(int i=0,j=0;i<cnt2;i++)
{
while(a[cnt1-cnt2+j]>=a[i])
{
if(a[cnt1-cnt2+j]==a[i])
flag=false;
j++;
}
}
if(flag) cout<<"Yes";
else cout<<"No";
return 0;
}
深夜加代码真的有种意境的(笑)
更多推荐
第六十二天 牛客62场小白月赛
发布评论