A
Solution
找出该段时间的分钟数 , 即为最终的答案。
Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,b,c,d,m;
signed main()
{
cin>>a>>b>>c>>d>>m;
cout<<(c*60+d)-(a*60+b)-m<<endl;
return 0;
}
B
Solution
首先,思考一下 的意义。它为总的答案贡献了2(一个 和一个 ),而 也为答案贡献了 (两个 )。
同时, 自己也能为答案产生 的贡献,而 自己无法对答案产生任何贡献。
所以我们填
干嘛呢?全填
不就行了?
于是,我们在所有的’?'上填
,再输出即为最终的答案。
Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
signed main()
{
string s;
cin>>s;
n=s.size();
for (int i=0;i<n;i++)
{
if (s[i]=='?') s[i]='D';
}
cout<<s<<endl;
return 0;
}
花絮: 看完题面直接往
方面想(只有
和
啊)
C
Solution
首先,设 表示深度为 的那一层中节点的数量。
容易得到, 。注意最后一层的所有节点均为叶节点。
于是,我们从两个角度开始推。
①已知
。
容易发现,第
层非叶节点的数量就是
;由于这是一棵可爱的二叉树,并且要让答案最大;所以我们要让这
个非叶节点的孩子的数量都是2。
我知道您觉得单独考虑这东西不行,因为 不一定是 ——于是我们考虑第二种情况。
②已知
。
首先,每个节点有且仅有一个父节点。所以,第
层的节点的数量就是第
的节点的数量**加上第
层的叶节点的数量。直接递推。
我知道您很奇怪—— 不一定是1啊~于是,我们决定结合①②考虑答案。
现在,我们通过这两种情况,大概得出了 的值。
容易发现,一层的节点的个数多了是不好的(这是一棵二叉树,如果每一层的节点数量都少那么这种树一定存在);所以, 通过上述两种情况计算出答案分别为 时, 。
注意,当 时(不可能在这一层产生这么多的叶节点),应该直接输出 。
于是答案就是 。时间复杂度 。
什么?要用高精度?
本蒟蒻解释一下为什么不用高精度。首先,对于任何一棵树,从上到下,每一层节点的数量一定是单调不减的。第 层的节点的数量 一定是每层节点个数中的最大值,所以答案一定小于 ,即 。既然最大值就这么一点,那么我们用 存储就可以了。
既然不用高精度,代码就简短啦~
Code
#include <bits/stdc++.h>
#define int unsigned long long
using namespace std;
int n,ans=0;
int a[100005],b[100005],c[100005];
int p[100005][205];
signed main()
{
cin>>n;
n++;
for (int i=1;i<=n;i++) cin>>a[i];
b[1]=1,c[n]=a[n];
for (int i=2;i<=n;i++) b[i]=(b[i-1]-a[i-1])*2;
for (int i=n-1;i>=1;i--) c[i]=c[i+1]+a[i];
for (int i=1;i<=n;i++) ans+=min(b[i],c[i]);
for (int i=1;i<=n;i++)
{
if (a[i]>b[i]) return cout<<-1<<endl,0;
}
cout<<ans<<endl;
return 0;
}
撒花✿✿ヽ(°▽°)ノ✿撒花