18-9-15 补题记录

8题做了2题……orz

而且第一题还是别人告诉我题意才能A过……

真的 要不退了吧?(别我说着玩玩 我得呆着)

脑袋空着也是空着不如放条咸鱼吧.jpg

A - Function Height

 ——死在阅读理解

题目特别长 我看不懂

但是实际上却是比较好整的

题意:输入n k  在2*n+1个点中的奇数点往上拉形成三角形 然后k是三角形的面积和 求三角形的最小高(高在所有三角形中取最高的)

让高最小那就平均一下 那一定是最小的 然后就整除就行了 

WA了两次

第一次是试着枚举了h 后来……h最大可以1e18……失败

第二次直接k/n 12/4=3完美 3/4=0 gg 失败

很明显除不尽的也得拿出来匀到其他的三角形里?所以也要单独的算 所以整除就直接k/n 无法整除k/n+1

估计代码精简点可以十来行搞定……

B - Diagonal Walking v.2

 ——死在数学归纳

刚读题认为是bfs 但是b不出 思考后觉得回朔法搞不好可以 但是很遗憾我不会

后来整了个表格可以试着模拟走步 发现可以先走最短路 然后绕着终点转圈

ps:题目的note就是迷惑的作用 烦死……

#include <iostream>
using namespace std;

int main() 
{
	int q;
	cin >> q;
	while (q--)
	{
		long long n,m,k;
		cin >> n >> m >> k;
		if (n > m)swap(n, m);//找出n、m中比较大的数 默认m较大 若n较大则交换n、m 所以m一直存放这比较大的数字
		if (k < m) { cout << -1 << endl; continue; }//m是最少的步骤
		if ((m - n) & 1) k--;//这个我真的无法解释 数学的东西 真的……奇数就真的一定会有一步无法斜着走
		else if ((k - m) & 1) k -= 2;//剩下的步数 如果剩下的步数是偶数可以直接斜着走两步到达 但是奇数无法做到
		cout << k << endl;
	}
	system("pause");
	return 0;
}
//先直接斜走 到达比较小的那个边 如5,3 先走到3,3 再横走两5 2步 但是两步横着的 可以变成两步斜着的 但是奇数步无法做到

大致可以看懂了 但是还是有疑问 或者说再来一道类似的题目我依然是写不出的 归纳能力真心不Ok

C - Classy Numbers

——死在各种不会

1e18 从一开始就觉得应该得打表做 就应该刚开始的时候就弄个数组vector 存上符合的数 一个一个筛绝对会超时

这个打表我确实看不懂 应该有回溯的思想 还没看……心急不了……

照着大佬的打了一遍还是一头雾水 先看完紫书了解一下回溯之类的再看

啊 不对 这是dfs!!!但是!!!我还是看不懂!!!

代码姑且先贴一下

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
vector<ll> vec;
void dfs(ll cur, int cnt, int len) {
	vec.push_back(cur);
	if (len == 18) return;
	dfs(cur * 10, cnt, len + 1);
	if (cnt < 3) {
		for (int i = 1; i <= 9; i++) {
			dfs(cur * 10 + i, cnt + 1, len + 1);
		}
	}
}

int main() {
	for (int i = 1; i <= 9; i++)
		dfs(i, 1, 1);
	vec.push_back(1e18);
	sort(vec.begin(), vec.end());
	int T;
	scanf("%d", &T);
	while (T--) {
		ll L, R;
		scanf("%lld%lld", &L, &R);
		int l = lower_bound(vec.begin(), vec.end(), L) - vec.begin();
		int r = upper_bound(vec.begin(), vec.end(), R) - vec.begin();
		cout << r - l << endl;
	}
	return 0;
}

第二天刷牙的时候突然想到这个 然后尝试了一下 其实也没有太难 畏难心理还是比较耽误人的 人为什么要进化出这种东西……

void dfs(long long n, int cnt, int len)
{
	v.push_back(n);
	if (len == 18)return;//先判断再*10
	dfs(n * 10, cnt, len + 1);
	if (cnt < 3)
	{
		for (int i = 1; i < 10; i++)
		{
			dfs(n * 10 + i, cnt + 1, len + 1);
		}
	}
}

一共607420个 要小心1e18那个数字比较容易漏掉

然后接下来就二分查找就可以了……

不是非常难 但是就是……怎么讲……

get不到要点【=能力差orz】

D - Vasya and Arrays

 完全独立写的 最近看到什么题都想到队列 其实这个不用队列也行 但是有了队列感觉会舒服一点……?有吗?

题意:输入两个数组 求合并一个连续的子列后是否可以使两个数组完全一致 如果是 输出最长

#include <iostream>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <iterator>
using namespace std;

const int maxn = 100000 + 5;

queue<long long>q1,q2;
int main()
{
	int n, m;
	cin >> n;
	long long sum1=0, sum2=0;
	for (int i = 0; i < n; i++)
	{
		long long t;
		cin >> t;
		q1.push(t);
		sum1 += t;
	}

	cin >> m;
	for (int i = 0; i < m; i++)
	{
		long long t;
		cin >> t;
		q2.push(t);
		sum2 += t;
	}

	if (sum1 != sum2)
	{
		cout << -1 << endl;
		return 0;
	}
	long long cnt = 0;;
	long long m1 = 0, m2 = 0;
	while (q1.size() && q2.size())
	{
		if (m1 == 0 && m2 == 0)
		{
			m1 += q1.front(); q1.pop();
			m2 += q2.front(); q2.pop();
		}
		if (m1 == m2)
		{
			cnt++;
			m1 = 0;
			m2 = 0;
		}
		else if (m1 > m2)
		{
			m2 += q2.front(); q2.pop();
		}
		else if (m1 < m2)
		{
			m1 += q1.front(); q1.pop();
		}
	}
	while (q1.size())
	{
		m1 += q1.front();
		q1.pop();
	}
	while (q2.size())
	{
		m2 += q2.front();
		q2.pop();
	}
	if (m1 != m2)
		cout << -1 << endl;
	else if (m1 == m2 && m1 && m2)
		cout << cnt + 1 << endl;
	else
		cout << cnt << endl;
	//system("pause");
	return 0;
}

剩下的我们都没有做对 最后一题甚至没有人做过 过段时间再看……?

猜你喜欢

转载自blog.csdn.net/qq_42191950/article/details/82716436
今日推荐