欢乐赛51 T4——T6
2025-07-08 22:17:29
发布于:浙江
T4 四舍五入
首先,注意到n(1≤n≤1000),就不能使用《cout<<fixed<<setpricision(m)<<x;》了,并且要将x以字符串(下文以s表示)输入。
判断四舍五入首先要判断s[m+2]。如果s[m+2]>'4',那么s[m+1]就加一,否则不变。但是如果就这么交上去,绝对是错的。因为s[m+1]或许为'9'。
注意到x(0<x<1),所以我们可以开一个循环,从s[m+1]到s[2],如果它是'9',就把它变成'0',否则停止循环。最后在判断一下,如果一直循环到s[2],那么就将s[0]变为'1'。
(m≤n) 特殊地,如果n==m,那么就会数组越界,我们可以在s的末尾加一个'0'。
#include <bits/stdc++.h>
using namespace std;
int n,m;
string s;
int main(){
cin>>n>>s>>m;
s+='0';
if(s[m+2]>'4'){
int x=m+1;
while(s[x]=='9' && x>1){
s[x--]='0';
}
if(x==1) s[0]='1';
else s[x]+=1;
}
for(int i=0;i<m+2;i++) cout<<s[i];
return 0;
}
T5 小明的bingo
这道题非常简单,直接上代码
弱智地对角线的循环是for(int i=0;i<n;n++) a[i][i]; 和 for(int i=0;i<n;n++) a[n-i+1][i];
#include <bits/stdc++.h>
using namespace std;
int n,c,d,ans;
int a[1000][1000];
int x[1000],y[1000];
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
y[i]+=a[i][j];
x[j]+=a[i][j];
}
}
for(int i=0;i<n;i++) c+=a[i][i];
for(int i=0;i<n;i++) d+=a[n-i-1][i];
if(c%2) ans++;
if(d%2) ans++;
for(int i=0;i<n;i++){
if(x[i]%2) ans++;
if(y[i]%2) ans++;
}
cout<<ans;
return 0;
}
T6 3倍
给定一个长度是n的数组, 对于其中所有的差值为3 的倍数的数对 ai,aj(1≤i,j≤n)ai,aj(1≤i,j≤n), 求其最大的差值并且输出.
作为一个学生,应该注意到'3'。3很小。根据直觉,我们可以开两个长度为3的数组,用来存放模3分别为0、1、2的最大值和最小值。最后输出差值最大的即可。
using namespace std;
int n,x,ans;
int mn[5],mx[5];
int main(){
cin>>n;
mn[0]=mn[1]=mn[2]=1e9;
for(int i=0;i<n;i++){
cin>>x;
mx[x%3]=max(x,mx[x%3]);
mn[x%3]=min(x,mn[x%3]);
}
for(int i=0;i<3;i++) ans=max(ans,mx[i]-mn[i]);
cout<<ans;
return 0;
}
这里空空如也
有帮助,赞一个