二进制回文数
利用栈stack作为媒介来求十进制数的二进制,再折半比较判断是否为回文数。
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
bool sample(int num)
{
stack<int> values;
while(num)
{
values.push(num%2);
num = num / 2;
}
vector<int> container;
while(!values.empty())
{
int cur = values.top();
container.push_back(cur);
values.pop();
}
int cl = container.size();
for(int ci=0; ci < cl/2; ci++)
{
if(container[ci] == container[cl-ci-1])
continue;
else
return false;
}
return true;
}
int main()
{
int t;
cin >> t;
for(int tu=0; tu < t; tu++)
{
int num;
cin >> num;
int res = sample(num);
if(res)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
递增树
由于给定了格式当前结点的编号:结点值、左结点的编号、右结点的编号
,所以采用字典来存储这样的一个类似于三元组的二叉树。在判断是否为递增二叉树之前,要根据字典values找出根节点,再利用队列deque结构来进行层次遍历。
#include <iostream>
#include <vector>
#include <map>
#include <deque>
#include <set>
using namespace std;
bool sample(int n, map<int, vector<int>> values)
{
if(n==1)
return true;
vector<int> bt;
for(int nu=0; nu < n; nu++)
bt.push_back(nu);
for(int nu=0; nu<n; nu++)
{
vector<int> current = values[nu];
int left=current[1], right=current[2];
if(left!=-1)
bt[left] = -1;
if(right!=-1)
bt[right] = -1;
}
int first=-1;
for(int nu=0; nu<n; nu++)
{
if(bt[nu] != -1)
{
first = nu;
break;
}
}
if(first == -1)
return false;
deque<vector<int>> container;
container.push_back(vector<int>(1, first));
int layer = -1;
while(!container.empty())
{
vector<int> vu = container.front();
container.pop_front();
int node_values = 0;
vector<int> nxt;
for(int si=0; si<int(vu.size()); si++)
{
int su = vu[si];
node_values += values[su][0];
if(values[su][1]!=-1)
nxt.push_back(values[su][1]);
if(values[su][2]!=-1)
nxt.push_back(values[su][2]);
}
if(!nxt.empty())
container.push_back(nxt);
if(layer<node_values)
{
layer = node_values;
// cout << node_values << endl;
}
else
return false;
}
return true;
}
int main()
{
int t;
cin >> t;
for(int tu=0; tu<t; tu++)
{
int n;
cin >> n;
map<int, vector<int>> values;
for(int nu=0; nu<n; nu++)
{
vector<int> value(3);
for(int i=0; i<3; i++)
{
cin >> value[i];
}
values.insert(pair<int, vector<int>>(nu, value));
}
int res = sample(n, values);
if(res)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
喝咖啡
要格外注意边界处理,比如固定天数m为0的情况,不是简单的除以(k+1),而是遍历一趟所能累加的次数。一般情况下,则是分别对left、right进行扫描,对固定天数m的两个元素值之间进行判断。
#include <iostream>
#include <vector>
using namespace std;
int coffee(int k, int m, vector<int> days)
{
if(k==0)
return 30;
if(m==0)
{
int res = 1, val = 1;
while(val < 31)
{
if(val+(k+1) < 31)
res += 1;
val += (k+1);
}
return res;
}
int res = m;
int left = days[0];
while(left>0)
{
if(left-k-1 > 0)
res += 1;
left -= (k+1);
}
int right = days[m-1];
while(right < 31)
{
if(right+k+1 < 31)
res += 1;
right += (k+1);
}
if(m==1)
return res;
for(int di=0; di < days.size()-1; di++)
{
int cur=days[di], nxt=days[di+1];
int gap = nxt - cur - 1;
int mid = (gap-(2*k+1))/(k+1) +1;
if(gap-(2*k+1)>= 0 && mid>=0)
res += mid;
}
return res;
}
int main()
{
int t;
cin >> t;
for(int tu=0; tu<t; tu++)
{
int k, m;
cin >> k >> m;
vector<int> days(m);
for(int mu=0; mu<m; mu++)
{
cin >> days[mu];
}
int res = coffee(k, m, days);
cout << res << endl;
}
return 0;
}
印章
题目内容有点冗杂,就直接放弃了。
(最近更新:2019年09月07日)