#单调栈#洛谷 2947 向右看齐

题目

i &lt; j 且 h i &lt; h j i&lt;j且h_i&lt;h_j i<jhi<hj,那么 j j j i i i的仰望对象,问每头奶牛最近的仰望对象。


分析

这道题可以用单调递减栈做,反向枚举每一头牛的身高,当栈内无法成为仰望对象时元素从栈顶弹出,当栈为空时说明没有仰望对象,否则栈顶就是仰望对象


代码

#include <cstdio>
#include <stack>
using namespace std;
stack<int>st; int n,x,a[100001],ans[100001];
int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	for (int i=n;i>=1;i--){
		while (st.size()&&a[st.top()]<=a[i]) st.pop();
		if (!st.size()) ans[i]=0; else ans[i]=st.top();
		st.push(i);
	}
	for (int i=1;i<=n;i++) printf("%d\n",ans[i]);
	return 0;
}
### C语言中实现输出右对齐的方法 在C语言中,`printf` 函数支持通过格式化字符串来控制输出的对齐方式。要实现字符或数字的右对齐,可以利用字段宽度指定符以及可选的填充字符。 #### 字段宽度与右对齐 当使用 `printf` 进行输出时,可以通过设置字段宽度来定义输出项占据的空间大小。如果实际数据长度小于指定的字段宽度,则会自动补充空白区域,默认情况下这些空白会被放置在左侧,从而实现右对齐效果[^1]。 例如: ```c #include <stdio.h> int main() { char str[] = "abc"; printf("|%6s|\n", str); // 输出 | abc| return 0; } ``` 上述代码中的 `%6s` 表示该字符串至少占用6个字符的位置。由于 `"abc"` 的长度仅为3,因此前缀有三个空格用于填补剩余空间,最终实现了右对齐的效果。 #### 零填充功能 除了默认的空格填充外,还可以启用零填充选项。这通常适用于数值类型的输出场景下希望以零代替空格完成填充的情况。只需在百分号后紧跟一个整数作为最小总宽,并在其前面加上 &#39;0&#39; 即可指示采用零而不是常规的空白来进行填充操作[^2]。 实例演示如下所示: ```c #include <stdio.h> int main(){ int num=42; printf("|%06d|\n",num); // 结果为|000042| return 0; } ``` 这里 `%06d` 中的 `0` 就是用来激活前置零的功能,而后面的 `6` 则指定了整个打印出来的数字应该占满六个位置;因为原始值只有两位数,所以额外增加了四个‘0’达到预期目标。 ### 总结 综上所述,在C语言里借助于标准库函数 `printf()` 能够轻松达成各种形式的数据排列需求,其中就包含了本文所讨论到的右侧调整布局技巧。无论是处理简单的文本串还是复杂的浮点型变量都可以灵活运用相应的修饰参数获得理想的结果展示样式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值