程序设计期末复习

Posted 超霸霸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序设计期末复习相关的知识,希望对你有一定的参考价值。

程序设计期末复习

7891 一元三次方程求解

#include<iostream>
#include<iomanip>
using namespace std;

double a, b, c, d;

double f(double x) 
	return a * x * x * x + b * x * x + c * x + d;


int main() 
	cin >> a >> b >> c >> d;
	double x1, x2, mid;
	for (int i = -100; i < 100; i++) 
		x1 = i;
		x2 = i + 1;
		if (f(x1) == 0) 
			cout << fixed << setprecision(2) << x1 << " ";
		
		else if (f(x1) * f(x2) < 0) 
			while (x2 - x1 >= 0.001) 
				mid = (x1 + x2) / 2;
				if (f(x1) * f(mid) <= 0) 
					x2 = mid;
				
				else 
					x1 = mid;
				
			
			cout << fixed << setprecision(2) << x1 << " ";
		
	
	return 0;

7617 分治法输出前k大的数

#include<iostream>
#include<algorithm>
using namespace std;

int a[100000], n, k;

bool cmp(int a, int b) 
	return a > b;


int main()

	cin >> n;
	for (int i = 0; i < n; i++) 
		cin >> a[i];
	
	cin >> k;
	sort(a, a + n, cmp);
	for (int i = 0; i < k; i++) 
		cout << a[i] << endl;
	
	return 0;

7620 分治法区间合并

#include<iostream>
#include<algorithm>

using namespace std;

int n, head, tail;

struct node 
	int start;
	int end;
a[60000];

bool cmp(node a, node b) 
	if (a.start == b.start) 
		return a.end < b.end;
	
	return a.start < b.start;


int main() 
	cin >> n;
	for (int i = 0; i < n; i++) 
		cin >> a[i].start >> a[i].end;
	
	sort(a, a + n, cmp);
	head = a[0].start;
	tail = a[0].end;
	for (int i = 1; i < n; i++) 
		if (a[i].start > tail) 
			cout << "no" << endl;
			return 0;
		
		tail = max(tail, a[i].end);
	
	cout << head << " " << tail << endl;
	return 0;

1775 采药

#include<iostream>

using namespace std;

int N, W, w[2000], v[2000], dp[2000][2000];

int main() 
	cin >> W >> N;
	for (int i = 1; i <= N; i++) 
		cin >> w[i] >> v[i];
	
	for (int i = 1; i <= N; i++) 
		for (int j = 0; j <= W; j++) 
			if (j < w[i]) 
				dp[i][j] = dp[i - 1][j];
			
			else 
				dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
			
		
	
	cout << dp[N][W];
	return 0;

4982 踩方格

#include<iostream>
using namespace std;

int dp[30];

int main() 
	int n;
	cin >> n;
	dp[0] = 1;
	dp[1] = 3;
	for (int i = 2; i <= n; i++) 
		dp[i] = dp[i - 2] + 2 * dp[i - 1];
	
	cout << dp[n];
	return 0;

2718 移动路线

#include<iostream>

using namespace std;

int m, n, dp[25][25];

int main() 
	cin >> m >> n;
	dp[1][1] = 1;
	for (int i = 1; i <= m; i++) 
		for (int j = 1; j <= n; j++) 
			dp[i][j] += dp[i - 1][j];
			dp[i][j] += dp[i][j - 1];
		
	
	cout << dp[m][n];
	return 0;

6252 带通配符的字符串匹配

#include<iostream>

using namespace std;

string s1, s2;
int dp[25][25]; //dp[i][j]为s1到i,s2到j是否匹配

int main() 
	cin >> s1 >> s2;
	s1 = ' ' + s1;
	s2 = ' ' + s2;
	dp[0][0] = 1;
	// s开头全为*的情况
	for (int i = 1; i < s1.size(); i++) 
		if (s1[i] == '*') 
			dp[i][0] = 1;
		
		else 
			break;
		
	
	for (int i = 1; i < s1.size(); i++) 
		for (int j = 1; j < s2.size(); j++) 
			if (s1[i] == '?') 
				dp[i][j] = dp[i - 1][j - 1];
			
			else if (s1[i] == '*') 
				dp[i][j] = (dp[i - 1][j - 1] || dp[i][j - 1] || dp[i - 1][j]);
			
			else if (s1[i] == s2[j]) 
				dp[i][j] = dp[i - 1][j - 1];
			
			else if (s1[i] != s2[j]) 
				dp[i][j] = 0;
			
		
	
	if (dp[s1.size() - 1][s2.size() - 1] == 1) 
		cout << "matched";
	
	else 
		cout << "not matched";
	
	return 0;

702 crossing river

#include<iostream>
#include<algorithm>

using namespace std;

int n, t, dp[2000];

void init() 
	cin >> n;
	for (int i = 1; i <= n; i++) 
		cin >> dp[i];
	
	sort(dp + 1, dp + n + 1);


void solve() 
	int res = 0;
	while (n) 
		if (n == 1) 
			res += dp[1];
			break;
		
		else if (n == 2) 
			res += dp[2];
			break;
		
		else if (n == 3) 
			res += dp[1] + dp[2] + dp[3];
			break;
		
		else if (n >= 4) 
			// 方案1: 最快和次快渡河,最快返回,最慢和次慢渡河,次快返回
			// 方案2: 最快和最慢渡河,最快返回,最快和次慢渡河,最快返回
			res += min(2 * dp[2] + dp[1] + dp[n], 2 * dp[1] + dp[n] + dp[n - 1]);
			n -= 2;
		
	
	cout << res << endl;


int main() 
	cin >> t;
	while (t--) 
		init();
		solve();
	
	return 0;

8465 马走日

#include<iostream>
#include<cstring>

using namespace std;

int t, n, m, x, y, ans;
int map[100][100];
int dx[8] =  1,1,-1, -1,2,2,-2,-2 ;
int dy[8] =  2,-2,2,-2,1,-1,1,-1 ;

void dfs(int a, int b) 
	bool flag = true;
	for (int i = 1; i <= n; i++) 
		for (int j = 1; j <= m; j++) 
			if (map[i][j] == 0) 
				flag = false;
				break;
			
		
	
	if (flag == true) 
		ans++;
		return;
	
	for (int i = 0; i < 8; i++) 
		int nowx = a + dx[i];
		int nowy = b + dy[i];
		if ((nowx >= 1 && nowx <= n) && (nowy >= 1 && nowy <= m) && map[nowx][nowy] == 0) 
			map[nowx][nowy] = 1;
			dfs(nowx, nowy);
			map[nowx][nowy] = 0;
		
	


int main() 
	cin >> t;
	for (int i = 0; i < t; i++) 
		cin >> n >> m >> x >> y;
		x++;
		y++;
		ans = 0;
		memset(map, 0, sizeof(map));
		map[x][y] = 1;
		dfs(x, y);
		cout << ans << endl;
	
	return 0;

2753 走迷宫

#include<iostream>

using namespace std;

int m, n, head, tail, x, y, nowx, nowy, step;
int sx[4] =  0,0,1,-1 ;
int sy[4] =  1,-1,0,0 ;
int visited[100][100];
char map[100][100];

struct info 
	int x, y, step;
queue[10000];

int main() 
	//输入地图信息
	cin >> m >> n;
	for (int i = 1; i <= m; i++) 
		for (int j = 1; j <= n; j++) 
			cin >> map[i][j];
		
	
	//初始化左上角点的信息
	head = 0;
	tail = 1;
	queue[tail].x = 1;
	queue[tail].y = 1;
	queue[tail].step = 1;
	while (head < tail) 
		head++;
		nowx = queue[head].x;
		nowy = queue[head].y;
		step = queue[head].step;
		//遍历四个方向
		for (int i = 0; i < 4; i++) 
			x = nowx + sx[i];
			y = nowy + sy[i];
			if ((x >= 1 && x <= m) && (y >= 1 && y <= n) && map[x][y] == '.' && visited[x][y] == 0) 
				if (x == m && y == n) 
					cout << step + 1;
					return 0;
				
				tail++;
				queue[tail].x = x;
				queue[tail].y = y;
				queue[tail].step = step + 1;
				visited[x][y] = 1;
			
		
	
	return 0;

1799 最短前缀

#include<iostream>
#include<cstring>

using namespace std;

char str[2000][50], pre[50], temp[50];
int i, j, k;

int main() 
	int n = 0;
	//循环输入str并获得字符串个数
	while (scanf("%s", str[n]) != EOF) 
		n++;
	

	//循环遍历字符串数组
	for (i = 0; i < n; i++) 
		//遍历该字符串str[i]
		for (j = 1; j < strlen(str[i]); j++) 
			strcpy(pre, str[i]);
			pre[j] = '\\0';
			//遍历字符串数组,使前缀不为其他字符串的子串
			for (k = 0; k < n; k++) 
				if (k == i) 
					continue;
				
				strcpy(temp, str[k]);
				temp[j] = '\\0';
				if (strcmp(temp, pre) == 0) 
					break;
				
			
			if (k == n) 
				break;
			
		
		if (j < strlen(str[i])) 
			cout << str[i] << " " << pre << endl;
		
		else 
			cout << str[i] << " " << str[i] << endl;
		
	

	return 0;

以上是关于程序设计期末复习的主要内容,如果未能解决你的问题,请参考以下文章

面向对象程序设计期末复习笔记

小程序期末复习

java程序设计期末复习总结&复盘

C++的期末大概复习

期末复习——线程

期末复习——进程与线程