2021夏季每日一题 week5 完结
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021夏季每日一题 week5 完结相关的知识,希望对你有一定的参考价值。
目录
3636. 数组延伸 【难度: 一般 / 知识点: 思维 模拟 压缩】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int t,n,x;
long long int a;
int main(void)
{
cin>>t;
while(t--)
{
cin>>n>>x;
queue< pair<int,int> >q;
long long int ans=0;
for(int i=0;i<n;i++) cin>>a,ans+=a,q.push({a,1});
int k=1;
while(q.size())
{
auto temp=q.front(); q.pop();
if(temp.first%x==0)
{
ans+=(temp.first)*(temp.second);
q.push({(temp.first)/x,(temp.second)*x});//压缩
}
else break;
k++;
}
cout<<ans<<endl;
}
return 0;
}
3646. 分水果 【难度: 一般 / 知识点: 二进制枚举】
#include<bits/stdc++.h>
using namespace std;
int a[7][3]=
{
{0,0,1},
{0,1,0},
{0,1,1},
{1,0,0},
{1,0,1},
{1,1,0},
{1,1,1}
};
int b[3],c[3],t,ans;
int main(void)
{
cin>>t;
while(t--)
{
int ans=0;
for(int i=0;i<3;i++) cin>>b[i];
for(int i=0;i<1<<7;i++)
{
int cnt=0;
memcpy(c,b,sizeof b);
bool flag=true;
for(int j=0;j<7;j++)
{
if(i>>j&1)
{
for(int k=0;k<3;k++) c[k]-=a[j][k];
cnt++;
}
}
for(int j=0;j<3;j++) if(c[j]<0) flag=false;
if(flag) ans=max(ans,cnt);
}
cout<<ans<<endl;
}
}
3655. 楼层 【难度: 简单 / 知识点: 模拟】
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int t; cin>>t;
while(t--)
{
int n,x; cin>>n>>x;
int l=1,r=2;
int k=1;
while(1)
{
if(n>=l&&n<=r) break;
l=r+1,r=k*x+2;
k++;
}
cout<<k<<endl;
}
return 0;
}
3663. 打印数字菱形 【难度: 一般 / 知识点: 曼哈顿距离 规律】
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int n;
int main(void)
{
cin>>n; n=(n+1)*2;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(j==0) continue;
if(i==0) continue;
if(abs(i-n/2)+abs(j-n/2)==n/2-1) cout<<"0 ";
else if(abs(i-n/2)+abs(j-n/2)<n/2)cout<<n/2-abs(i-n/2)-abs(j-n/2)-1<<" ";
else cout<<" ";
}
if(i)cout<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int n; cin>>n;
for(int i=0;i<n*2+1;i++)
{
for(int j=0;j<n*2+1;j++)
{
int t=abs(i-n)+abs(j-n);
if(t<n+1) cout<<abs(n+1-t)-1<<" ";
else cout<<" ";
}
cout<<endl;
}
return 0;
}
3664. 数组补全 【难度: 一般 / 知识点: 贪心】
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int n,k,p,x,y;
int main(void)
{
cin>>n>>k>>p>>x>>y;
int l=0,r=0,sum=x;//统计左边有多少个数,右边有多少个数,sum是剩余的总和
for(int i=0;i<k;i++)
{
cin>>a[i];
if(a[i]<y) l++;
else r++;
sum-=a[i];
}
if(l>n/2)//左边的个数大于一半了
{
cout<<-1;
return 0;
}
else if(r>=(n+1)/2)//右边的个数大于一半了,直接补左边即可
{
l=(n-k);
r=0;
}
else//左右都需要加
{
l=n/2-l;
r=(n+1)/2-r;
}
for(int i=y;i<=p;i++)
{
for(int j=1;j<=y;j++)
{
if(l*j+i*r<=sum)
{
for(int k=1;k<=l;k++) cout<<j<<" ";
for(int k=1;k<=r;k++) cout<<i<<" ";
return 0;
}
}
}
cout<<-1;
return 0;
}
以上是关于2021夏季每日一题 week5 完结的主要内容,如果未能解决你的问题,请参考以下文章