牛客周赛 Round 66——补题
A.小苯吃糖果
把最多的一堆和除最多的一堆其他糖果堆比较即可
int main()
{
int a,b,c;
cin>>a>>b>>c;
cout<<max(max({a,b,c}),a+b+c-max({a,b,c}));
return 0;
}
B.小苯的排列构造
令ai=qi+q(qi) ai-1<=ai
意思是
例如
q=3 q[3 2 1]
a1=q1(1)+q(q1)=3+1=4
a2=q2(2)+q(q2)=2+2=4
a3=q3(3)+q(q3)=1+3=4
构造一个满足这个算法的排序即可
只需从小到大输出 n 即可满足
10 9 8 7 6 5 4 3 2 1 ai都等于11
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=n;i>=1;i--) cout<<i<<" ";
cout<<endl;
}
return 0;
}
C.小苯的最小整数
暴力枚举所有可能,找出最小值
{
long long n;
cin>>n;
while(n--)
{
long long m=0,min=0;
string s;
cin>>m;
min=m;
s=to_string(m);
long long maxwei=s.length();
long long wei=pow(10,maxwei-1);
for(int i=0;i<maxwei-1;i++)
{
int temp=m/wei;
m=m%wei;
m=m*10;
m+=temp;
if(m<min)
{
min=m;
}
}
cout<<min<<endl;
}
return 0;
}
字符串做法
思路: 通过substr函数截取字符串进行比较找到最小值,字典序大小即是数字大小
{
int n;
string s;
cin>>n;
while(n--)
{
string ans;
cin>>s;
ans=s;
int m=s.size();
s+=s;
for(int i=1;i<=m;i++)
{
string t=s.substr(i,m);
ans=min(ans,t);
}
cout<<ans<<endl;
}
return 0;
}
D.小苯的蓄水池(easy)
1.定义三个数组
water(存放每个区域的水量),block(存放挡板状态),sum(预处理各个区域水量的总和)
思路:根据接收的op 1?2 进行不同的操作
1 表示拿挡板
cin>>l>>r;
for(int i=l;i<r;i++)//取掉相应的挡板
{
block[i]=0;
}
2.进行查询
cin>>j;
int L=j,R=j;
//先查左边 墙| -|- | -|墙 |为挡板
for(int i=j-1;j>0;i--)
//j 接受的是水池区域 而挡板在两块区域之间所以找左边的时候要在当前位置-1才是该水池左边第一个挡板的位置
{
if(!block[i])L=i;
else break; //直到遇见有挡板的为止
}
//查右边
for(int i=j;i<n;j++)
{
if(!block[i])R=i+1; //找到右挡板后位置要加一,因为该位置右侧也会一起混合范围自然也要包括他
else break;
}
//最后 通过前缀和找到L R之间水量的平均值即可
double s=sum[R]-sum[L-1];
cout<<fixed<<setprecision(10)<<1.0*s/(R-L+1)<<endl;
//(R-L+1)水池数
void solve()
{
//思路 查找要查询的水池最左右两边被拿走的挡板的位置求之间的平均水量
int n,m;
cin>>n>>m;
vector<long long>water(n+1),sum(n+1),block(n);//挡板
for(int i=1;i<=n;i++)
{
cin>>water[i];
sum[i]=sum[i-1]+water[i];
block[i-1]=1;
}
while(m--)
{
int op;
cin>>op;
if(op==1)
{
int r,l;
cin>>l>>r;
for(int i=l;i<r;i++)block[i]=0; //取掉挡板
}
else
{
int j;
cin>>j;
int R=j,L=j;
for(int i=j-1;i>0;i--)
{
if(!block[i])L=i;
else break;
}
for(int i=j;i<n;i++)
{
if(!block[i])R=i+1;
else break;
}
double s=sum[R]-sum[L-1];
cout<<fixed<<setprecision(10)<<1.0*s/(R-L+1)<<endl;
}
}
}
查看21道真题和解析