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;
}
剩下的我们都没有做对 最后一题甚至没有人做过 过段时间再看……?