4 条题解
-
3
按照题意,每次选取一个最小的位置,然后左右递归建树即可,每次选择的根的子树大小就是当前序列的长度。
void dfs(int l, int r) { int minPos = l; for (int i = l + 1; i <= r; i++) if (a[i] < a[minPos]) minPos = i; siz[a[minPos]] = r - l + 1; if (minPos > l) dfs(l, minPos - 1); if (minPos < r) dfs(minPos + 1, r); } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; dfs(1, n); for (int i = 1; i <= n; i++) cout << siz[i] << " "; return 0 }
-
0
100分题解
判断每一个数周围有多少个连续的比它大的数,如:
数列3,1,5,2,4, 1周围有5个大于等于1的数:3,1,5,2,4 2周围有3个大于等于1的数:5,2,4 3周围有1个大于等于1的数:3
时间复杂度:O(n²)
#include using namespace std; int n,a[1001],b[1001],sum; int main() { cin >> n; for (int i = 1;i <= n;i++) { cin >> a[i]; b[a[i]] = i; } for (int i = 1;i <= n;i++) { sum = -1; for (int j = b[i];j >= 1;j--) { if (a[j] < i) { break; } sum++; } for (int j = b[i];j <= n;j++) { if (a[j] < i) { break; } sum++; } cout << sum << " "; } return 0; }
-
-22
写题解请注意 鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 1216
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 299
- 已通过
- 113
- 上传者