题目大意
有木块a和木块b,a的长度比b短,他俩同时放在一个轨道上,头都顶着左边,轨道长为c,现在移动a和b,在a不超出b的前提下(有可能是左超出,有可能是右超出),求他俩都到达轨道右边的最小移动步数。
ps:a就算和b一起动,那么最后的步数也应该是a动的加上b动的。
模拟可以过的,因为只要两个木块右边的点到达轨道的右边就算完成,所以就以两个木块的右端点来作为移动的标志,先挪a,每次a只能到和b相同的位置,b每次最多可以移动b-a次,要保证b左边不会在a右边的右边,画图可以感觉出来。
代码
#include <iostream>
using namespace std;
int main()
{
int a,b,n;
scanf("%d %d %d",&a,&b,&n);
int c=b-a;
int cnt=0;
while(b<n)
{
if(a<n)
{
a=b;
cnt++;
}
b+=c;
cnt++;
}
if(a<n)
cnt++;
printf("%d\n",cnt);
return 0;
}
题目大意
给你一个数对(x,y)。x符合二叉搜索树的规则(左子小于父亲,父亲小于右子),y符合堆的规则(根大于等于子),并且y=sinx,给你一个n,你需要输出n个答案,构造出高度为n的数堆,输出x。
题目大意
选一个点,使得所有点到该点的距离相等,如果找不到,输出NO,否则输出YES,并且输出其中符合要求的一个点。
题目大意
给你一个有n个数字的序列,q组询问,每组有一个t,问你将这个序列最少分成多少段才能使每一组的和都小于等于t,输出这个最小值。
想法是二分加前缀和。二分来找到每一段的长度,在用一个循环来控制区间的移动,但是,需要加记忆化,不然会T,就…很…
代码
#include <iostream>
using namespace std;
const int maxn=2e6;
int a[maxn];
int sum[maxn]={0};
int ans[maxn];
int n;
int erfen(int x)
{
int cnt=0;
int L=1,R=n;
int l=1,r=n;
while(L<R)
{
cnt++;
while(l<r)
{
int mid=l+r+1>>1;
if(sum[mid]-sum[L-1]<=x)
l=mid;
else
r=mid-1;
}
r=n;
L=l+1;
l++;
}
if(L==R) //分到最后还剩下一个数字为一个区间的处理
cnt++;
return cnt;
}
int main()
{
scanf("%d",&n);
int maxx=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
maxx=max(maxx,a[i]);
}
sum[1]=a[1];
for(int i=2;i<=n;i++)
{
sum[i]=sum[i-1]+a[i];
}
int q;
scanf("%d",&q);
while(q--)
{
int t;
scanf("%d",&t);
if(t<maxx)
{
printf("Impossible\n");
}
else
{
if(ans[t]==0) //记忆化,不然会T
{
ans[t]=erfen(t);
}
printf("%d\n",ans[t]);
}
}
return 0;
}
题目大意
给你n组点(x,y,h)。要求找到一个金字塔,金字塔的斜面和底面夹角是45°,并且这个金字塔要把这n组点都包含进去,让你求金字塔的中点。
未完待续…
这篇博客介绍了ICPC 2019-2020 North-Western Russia Regional Contest的补题,包括'A - Accurate Movement','B - Bad Treap'等题目。博主详细解析了每个问题的思路,如'A'题通过模拟解决,'B'题利用二叉搜索树和堆的性质构造答案。还提及了'E - Equidistant'和'H - High Load Database G'等题目,涉及到距离相等问题和序列分割优化。文章最后提到了'I - Ideal Pyramid',但未给出完整解答。
583

被折叠的 条评论
为什么被折叠?



