1. 程式人生 > >18-9-15 補題記錄

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 q;
long long n, m, k;
int main()
{
	scanf("%d", &q);
	while (q--)
	{
		scanf("%lld%lld%lld", &n, &m, &k);
		if (n > m) swap(n, m);//找出n、m中比較大的數 預設m較大 若n較大則交換n、m 所以m一直存放這比較大的數字
		if (m > k) { puts("-1"); continue; }//m是最少的步驟
		if ((m - n) & 1) k--;//這個我真的無法解釋 數學的東西 真的……奇數就真的一定會有一步無法斜著走
		else if ((k - m) & 1) k -= 2;//剩下的步數 如果剩下的步數是偶數可以直接斜著走兩步到達 但是奇數無法做到
		printf("%lld\n", k);
	}
	return 0;
}//先直接斜走 到達比較小的那個邊 如5,3 先走到3,3 再橫走兩5 2步 但是兩步橫著的 可以變成兩步斜著的 但是奇數步無法做到

大致可以看懂了 但是還是有疑問 或者說再來一道類似的題目我依然是寫不出的 歸納能力真心不Ok

C - Classy Numbers

——死在各種不會

1e18 從一開始就覺得應該得打表做 就應該剛開始的時候就弄個數組vector 存上符合的數 一個一個篩絕對會超時

這個打表我確實看不懂 應該有回溯的思想 還沒看……心急不了……

照著大佬的打了一遍還是一頭霧水 先看完紫書瞭解一下回溯之類的再看

程式碼姑且先貼一下

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

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

剩下的我們都沒有做對 最後一題甚至沒有人做過 過段時間再看……?