18-9-15 補題記錄
阿新 • • 發佈:2018-12-10
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;
}
剩下的我們都沒有做對 最後一題甚至沒有人做過 過段時間再看……?