- 王晨逸 的博客
Day04
- @ 2024-7-18 19:07:22
T1统计方形
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,m,lon=0,sho=0;
int main(){
freopen("rect.in","r",stdin);
freopen("rect.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=min(n,m);i++){
sho+=(n-i+1)*(m-i+1);
}
lon=(n+1)*(m+1)*n*m/4-sho;
cout<<sho<<" "<<lon;
return 0;
}
思路:!!!所有数据都要用long long类型!!!for循环内i<=(要取n或m的最小值)正方形和长方形用数学公式解决:正方形:
长方形:
(n+1)*(m+1)*n*m/4再减正方形的个数。
T2说谎者的数量
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t,n,a[101],sum=0;
cin>>t;
while(t--){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int f=1;
for(int i=0;i<=n;i++){//假设说谎者的人数
for(int j=0;j<n;j++){
if(a[j]>i){
sum++;
}
}
if(sum==i){
cout<<i<<endl;
f=0;
}
sum=0;
}
if(f==1){
cout<<-1<<endl;
}
f=1;
}
return 0;
}
思路:int一个整数=1,代表如果所有人的话都矛盾,那么输出-1,否则如果找到了正解,那么这个数=0,用双层for循环,外层代表假设说谎者的人数,内层循环去判断有没有人说谎,之后输出。
T3珠心算测验
代码:
#include<bits/stdc++.h>
using namespace std;
int n,st[100001],a[10001],ans=0;
int main(){
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a,a+n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i!=j){
int sum=a[i]+a[j];
st[sum]=1;
}
}
}
for(int i=1;i<=n;i++){
if(st[a[i]]==1){
ans++;
}
}
cout<<ans;
return 0;
}```
思路:用sort对a数组进行排序,默认从小到大,双重for循环用桶排序存储起来,(前提条件:i!=j)集中用for输出,并且要判断桶排序里面是否有这个数字,在输出。
错误原因:在输出时,判断条件是st[i]==1,应为st[a[i]]==1。
T4比例简化
代码:
#include<bits/stdc++.h>
using namespace std;
double a,b,l,min1=1e9;
int a1,b1;
int main(){
freopen("reduce.in","r",stdin);
freopen("reduce.out","w",stdout);
cin>>a>>b>>l;
for(double i=1;i<=l;i++){
for(double j=1;j<=l;j++){
if(min1>i/j-a/b&&i/j-a/b>=0){
min1=i/j-a/b;
a1=i;
b1=j;
}
}
}
cout<<a1<<" "<<b1;
return 0;
}
思路:除输出的两个整数外,所有数都要用double类型存储小数,用双层循环判断i/j-a/b是否小于最小的差,如果是,最小的差等于i/j-a/b,最后输出的两个数变成i,j。
错误原因:判断条件是i/j-a/b>=0,不是i/j-a/b>0。
T5扫雷游戏
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,b[1010][1010];
char a[1010][1010];
int main(){
freopen("boom.in","r",stdin);
freopen("boom.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='*'){
b[i-1][j-1]++;
b[i-1][j]++;
b[i-1][j+1]++;
b[i][j-1]++;
b[i][j+1]++;
b[i+1][j-1]++;
b[i+1][j]++;
b[i+1][j+1]++;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='*'){
cout<<a[i][j];
}else{
cout<<b[i][j];
}
}
cout<<endl;
}
return 0;
}