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;
}

思路:用双重for循环判断,如果a[i][j]是”*“的话,那么他的八个临近方位的数字全部加一。(补充:判断的双重for循环i和j都要是1,判断条件是<=n,这样是为了避免数字超出界限外面。)

错误原因:二维数组的行和列搞混了。

今天的重点错误:数组忘记放到主函数外面,二位数组开的太大,二维数组最多只能是3000,二维数组的横向和纵向搞混了导致输出错误。