2022.01.14日总结

上午8:00~12:00

蓝桥杯训练

拿金币

资源限制

时间限制:1.0s 内存限制:256.0MB

问题描述

  有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。

输入格式

  第一行输入一个正整数n。
  以下n行描述该方格。金币数保证是不超过1000的正整数。

输出格式

  最多能拿金币数量。

样例输入

3
1 3 3
2 2 2
3 1 2

样例输出

11

数据规模和约定

 n<=1000

思路:动态规划,每次拿取,应选择最大金币数。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>

using namespace std;

int a[1001][1001] = { 0 };

int main()
{
	int n;
	cin >> n;

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			cin >> a[i][j];
		}
	}

	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			a[i][j] += ((a[i - 1][j] > a[i][j - 1]) ? a[i - 1][j] : a[i][j - 1]);
		}
	}

	cout << a[n][n];

	return 0;
}

数字游戏

资源限制

时间限制:1.0s   内存限制:256.0MB

问题描述

  给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。
  例如:
  3 1 2 4
  4 3 6
  7 9
  16
  现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。

输入格式

  第1行为两个正整数n,sum

输出格式

  一个1~N的一个排列

样例输入

4 16

样例输出

3 1 2 4

数据规模和约定

  0<n<=10

 思路:暴力输出,根据数据规模不难发现,直接列出所有可能的情况,然后逐一比较。

#include <iostream>
#include <iomanip>
#include <climits>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
int main()
{
	int a[20], b[20];
	int k = 0, j;
	int n, sum;
	cin >> n >> sum;
	j = n;
	for (int i = 0; i < n; i++)
		a[i] = i + 1;
	do {
		for (int i = 0; i < n; i++) {
			b[i] = a[i];
		}
		while (j > 1) {
			for (int i = 0; i < n - 1; i++) {
				b[i] = b[i] + b[i + 1];
			}
			j--;
		}
		j = n;
		if (b[0] == sum) {
			k = 1;
			break;
		}
	} while (next_permutation(a, a + n));
	if (k == 1) {
		for (int i = 0; i < n; i++)
			cout << a[i] << " ";
	}
	return 0;
}

下午:3:00~6:00  复习高数

上一篇:逆向工程核心原理之第13章PE文件格式导入表的初步理解


下一篇:不完整字符串日期时间转Date