【洛谷题单入门6】P5461\P5740\P5741\P5742\P1075

P5461 赦免战俘

题目描述

现有 2 n × 2 n ( n ≤ 10 ) 2^n\times 2^n (n\le10) 2n×2n(n10) 名作弊者站成一个正方形方阵等候 kkksc03 的发落。kkksc03 决定赦免一些作弊者。他将正方形矩阵均分为 4 个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免,剩下 3 个小矩阵中,每一个矩阵继续分为 4 个更小的矩阵,然后通过同样的方式赦免作弊者……直到矩阵无法再分下去为止。所有没有被赦免的作弊者都将被处以棕名处罚。

给出 n,请输出每名作弊者的命运,其中 0 代表被赦免,1 代表不被赦免。

输入格式

一个整数 n。

输出格式

2 n × 2 n 2^n \times 2^n 2n×2n 的 01 矩阵,代表每个人是否被赦免。数字之间有一个空格。

输入输出样例

输入

3

输出

0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 1
0 0 0 0 1 1 1 1
0 0 0 1 0 0 0 1
0 0 1 1 0 0 1 1
0 1 0 1 0 1 0 1
1 1 1 1 1 1 1 1

代码如下

法一:

#include  
#include 
using namespace std;
long long a[1050][1050];
void f(int x,int y,int x1, int y1){
	if(x1<=x && y1<=y) {  //递归终止条件,末位置小于初始位置  
		return;
	}    
	for(int i=x;i<=x1; i++){
		for(int j=y; j<=y1; j++){
			if(i<=x+(x1-x+1)/2-1 && j<=y+(y1-y+1)/2-1){  //属于左上角填0 
				a[i][j]=0;
			}else{  //其他填1 
				a[i][j]=1;
			}
		}
	}          
	f(x,y+(y1-y+1)/2,x+(x1-x+1)/2-1,y1);  //右上 起始位置+长度-1=末位置 
	f(x+(x1-x+1)/2,y,x1,y+(y1-y+1)/2-1);  //左下 
	f(x+(x1-x+1)/2,y+(y1-y+1)/2,x1,y1);  //右下 
}

int main(){
	int n;
	cin>>n;
	f(1,1,pow(2,n),pow(2,n));
	for(int i=1; i<=pow(2,n); i++){  
		for(int j=1; j<=pow(2,n); j++){
			cout<<a[i][j]<<" ";
		}cout<<endl;
	}
	return 0;
}

法二:

#include  
#include 
using namespace std;
long long a[1050][1050];
void f(int x,int y,int x1, int y1){
	if(x1<=x && y1<=y) {  //递归终止条件,末位置小于初始位置 
		a[x][y]=1;   //只要x=x1,y=y1,就要填1 
		return;
	}              
	f(x,y+(y1-y+1)/2,x+(x1-x+1)/2-1,y1);  //右上 起始位置+长度-1=末位置 
	f(x+(x1-x+1)/2,y,x1,y+(y1-y+1)/2-1);  //左下 
	f(x+(x1-x+1)/2,y+(y1-y+1)/2,x1,y1);  //右下 
}

int main(){
	int n;
	cin>>n;
	f(1,1,pow(2,n),pow(2,n));
	for(int i=1; i<=pow(2,n); i++){  
		for(int j=1; j<=pow(2,n); j++){
			cout<<a[i][j]<<" ";
		}cout<<endl;
	}
	return 0;
}

P5740 【深基7.例9】最厉害的学生

题目描述

现有 N 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 8 个字符的仅有英文小写字母的字符串)、语文、数学、英语成绩(均为不超过 150 的自然数)。总分最高的学生就是最厉害的,请输出最厉害的学生各项信息(姓名、各科成绩)。如果有多个总分相同的学生,输出靠前的那位。

输入格式

第一行输入一个正整数 N,表示学生个数。

第二行开始,往下 N 行,对于每一行首先先输入一个字符串表示学生姓名,再输入三个自然数表示语文、数学、英语的成绩。均用空格相隔。

输出格式

输出最厉害的学生。

输入输出样例

输入

3
senpai 114 51 4
lxl 114 10 23
fafa 51 42 60

输出

senpai 114 51 4

代码如下

#include  
#include 
using namespace std;
struct student{  //student是结构体的名称 
	string name;  //name表示姓名 
	int chinese,math,eng,score,id; 
	//id,chinese,math,eng,ave 分别表示学号、语文、数学、英语、平均分成绩。 
}data[1030];  //data是一个结构体数组,每个数组元素是一个结构体数据类型 
 
bool mycmp( student a, student b){  //定义结构体的比较方式 
	return(a.score>b.score || a.score==b.score && a.id<b.id ) ; 
	 //总分按降序,必须要对id进行判断 
} 

int main(){
	int n;
	cin>>n;
	for(int i=0; i<n; i++){  //输入求总分 
		cin>>data[i].name>>data[i].chinese>>data[i].math>>data[i].eng;
		data[i].score= data[i].chinese+data[i].math+data[i].eng;
		data[i].id=i;
	}
	sort(data,data+n,mycmp);  //按自定义排序 
	cout<<data[0].name<<" "<<data[0].chinese<<" "<<data[0].math<<" "<<data[0].eng<<endl;
	return 0;
}

P5741 【深基7.例10】旗鼓相当的对手 - 加强版

题目描述

现有 N ( N ≤ 1000 ) N(N\le 1000) N(N1000) 名同学参加了期末考试,并且获得了每名同学的信息:姓名(不超过 8 个字符的字符串,没有空格)、语文、数学、英语成绩(均为不超过 150 的自然数)。如果某对学生 < i , j > \text{<}i,j\text{>} <i,j> 的每一科成绩的分差都不大于 5,且总分分差不大于 10,那么这对学生就是“旗鼓相当的对手”。现在我们想知道这些同学中,哪些是“旗鼓相当的对手”?请输出他们的姓名。

所有人的姓名是按照字典序给出的,输出时也应该按照字典序输出所有对手组合。也就是说,这对组合的第一个名字的字典序应该小于第二个;如果两个组合中第一个名字不一样,则第一个名字字典序小的先输出;如果两个组合的第一个名字一样但第二个名字不同,则第二个名字字典序小的先输出。

输入格式

第一行输入一个正整数 N,表示学生个数。

第二行开始,往下 N 行,对于每一行首先先输入一个字符串表示学生姓名,再输入三个自然数表示语文、数学、英语的成绩。均用空格相隔。

输出格式

输出若干行,每行两个以空格隔开的字符串,表示一组旗鼓相当的对手。注意题目描述中的输出格式。

输入输出样例

输入

3
fafa 90 90 90
lxl 95 85 90
senpai 100 80 91

输出

fafa lxl
lxl senpai

代码如下

#include  
#include 
using namespace std;
struct student{  //student是结构体的名称 
	string name;  //name表示姓名 
	int chinese,math,eng,score; 
	//chinese,math,eng,ave 分别表示学号、语文、数学、英语、平均分成绩。 
}data[1030]; 

int main(){
	int n;
	cin>>n;
	for(int i=0; i<n; i++){  //输入求总分 
		cin>>data[i].name>>data[i].chinese>>data[i].math>>data[i].eng;
		data[i].score= data[i].chinese+data[i].math+data[i].eng;
	}
	for(int i=0; i<n-1; i++){
		for(int j=i+1; j<n; j++){
			if(abs(data[i].score-data[j].score)<=10 &&
			abs(data[i].chinese-data[j].chinese)<=5 &&
			abs(data[i].math-data[j].math)<=5 &&
			abs(data[i].eng-data[j].eng)<=5){
				cout<<data[i].name<<" "<<data[j].name<<endl;
			}
		}
	} 
	return 0;
}

P5742 【深基7.例11】评等级

题目描述

现有 N 名同学,每名同学需要设计一个结构体记录以下信息:学号、学业成绩和素质拓展成绩、综合分数(实数)。每行读入同学的姓名、学业成绩和素质拓展成绩,并且计算综合分数(分别按照 70 % 70\% 70% 30 % 30\% 30% 权重累加),存入结构体中。还需要在结构体中定义一个成员函数,返回该结构体对象的学业成绩和素质拓展成绩的总分。

然后需要设计一个函数,其参数是一个学生结构体对象,判断该学生是否“优秀”。优秀的定义是学业和素质拓展成绩总分大于 140 分,且综合分数不小于 80 分。

当然通过本题很容易啦,本题只是为了帮助你训练结构体的使用方法。

本题存在精度误差问题,请将 a ∗ 0.3 + b ∗ 0.7 a * 0.3 + b * 0.7 a0.3+b0.7 与 80 比较 转化为 a ∗ 3 + b ∗ 7 a * 3 + b * 7 a3+b7 与 800 比较。

输入格式

第一行一个整数 N。

接下来 N 行,每行 3 个整数,依次代表学号、学业成绩和素质拓展成绩。

输出格式

N 行,如果第 i 名学生是优秀的,输出 Excellent,否则输出 Not excellent。

输入输出样例

输入

4
1223 95 59
1224 50 7
1473 32 45
1556 86 99

输出

Excellent
Not excellent
Not excellent
Excellent

代码如下

#include  
#include 
using namespace std;
struct student{   
	int id,xueye,suzhi;
	float zonghe; 
	//学业、素质、综合 
}data[1030]; 

int main(){
	int n;
	cin>>n;
	for(int i=0; i<n; i++){  //输入求综合 
		cin>>data[i].id>>data[i].xueye>>data[i].suzhi;
		data[i].zonghe= data[i].xueye*7+data[i].suzhi*3;
		if(data[i].xueye+data[i].suzhi>140 && data[i].zonghe >=800){
			cout<<"Excellent"<<endl;
		}
		else{
			cout<<"Not excellent"<<endl;
		}
	}
	return 0;
}

P1075 [NOIP2012 普及组] 质因数分解

题目描述

已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数。

输入格式

输入一个正整数 n。

输出格式

输出一个正整数 p,即较大的那个质数。

输入输出样例

输入

21

输出

7

代码如下

#include
using namespace std;
int main(){
	int n, p;
	cin >> n;
	for(int i=2; i<n/2; i++){
		if(n % i == 0){
			p=n/i;
			break;
		}
	}
	cout << p;
	return 0;
}

你可能感兴趣的:(洛谷题单解析,算法,矩阵,c++)