Day9 洛谷 1317+1401
零基础洛谷刷题记录
Day1 2024.11.18
Day2 2024.11.25
Day3 2024.11.26
Day4 2024.11.28
Day5 2024.11.29
Day6 2024 12.02
Day7 2024.12.03
Day8 2024 12 05
Day9 2024.12.07
低洼地
1317:题目描述(改了n多次的题目)
一组数,分别表示地平线的高度变化。高度值为整数,相邻高度用直线连接。找出并统计有多少个可能积水的低洼地?
如图:地高变化为 [0,1,0,2,1,2,0,0,2,0]。
1317:AC代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int arr[10001];
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int wadi = 0;
int left = 0;
int right = 0;
for (int i = 1; i < n - 1; i++)
{
if (arr[i] > arr[i - 1] || arr[i] > arr[i + 1])//根本不可能满足
{
continue;
}
if (arr[i] < arr[i - 1] && arr[i] < arr[i + 1])//直接满足
{
wadi++;
}
else//可能满足
{
//对左边进行判断
if (arr[i] < arr[i - 1])//左边直接满足
{
left = 1;
}
else if (arr[i] == arr[i - 1])//左边可能满足。往左边一个一个试
{
int j = 2;
while (i - j >= 0)
{
if (arr[i] < arr[i - j])
{
left = 1;
break;
}
else if (arr[i] == arr[i - j])
{
j++;
}
else if (arr[i] > arr[i - j])
{
break;
}
}
}
if (left == 0)//左边不满足右边就不用管了
{
continue;
}
//右边判断
if (arr[i] < arr[i + 1])//右边直接满足
{
right = 1;
}
else if (arr[i] == arr[i + 1])//右边可能满足
{
i++;//对于连续平齐点,只算一个洼地,因此i++防止后面重复计算
while (i < n - 1)//判断的基本条件
{
if (arr[i] < arr[i + 1])//一比右边小就行
{
right = 1;
break;
}
else if (arr[i] == arr[i + 1])//相等就继续右移,还有机会
{
i++;
}
else if (arr[i] > arr[i + 1])//大于就不可能了
{
break;
}
}
}
if (left == 1 && right == 1)//左右都满足就形成一个洼地
{
wadi++;
}
left = 0;
right = 0;//重新置0
}
}
printf("%d\n", wadi);
return 0;
}
1317:学习成果
- 深刻体会到什么叫做程序员的严谨,什么叫做牵一发动全身
- 一些起决定性作用的语句放前面
- 一道非常考研严谨的题目
- 要学会自己想一些用例进行判断,用例应该有象征性,而不是一股脑下载数据
- 下载下来的几组用例
- (1)int:10
0 1 1 1 1 0 1 1 1 0 - (2)out:1
- (3)int:200
0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 0 4 9 7 4 2 5 8 6 4 5 8 6 1 3 4 5 6 8 7 7 4 5 7 5 7 5 4 3 8 6 3 3 3 4 6 7 2 5 8 7 5 9 3 4 5 6 7 8 7 6 5 3 2 3 4 7 6 4 8 6 5 6 5 2 4 7 8 9 6 7 8 2 3 7 8 5 6 7 8 5 3 4 9 7 6 4 5 6 8 7 5 3 5 9 8 6 7 8 7 8 7 7 8 9 2 3 4 5 7 8 6 5 4 5 7 6 7 8 9 0 0 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 0 4 9 7 4 2 5 8 6 4 5 8 6 1 3 4 5 6 8 7 7 4 5 7 5 7 5 4 3 8 6 3 3 3 4 6 7 2 5 8 7 - (4)out:53
- (5)in:100
0 43 65 87 4 98 43 98 4 98 54 98 4 76 4 87 9 9 56 54 65 65 54 43 43 65 54 98 23 12 0 43 65 87 4 98 43 98 4 98 54 98 4 76 4 87 9 9 56 54 65 65 54 43 43 65 54 98 23 12 0 43 65 87 4 98 43 98 4 98 54 98 4 76 4 87 9 9 56 54 65 65 54 43 43 65 54 98 23 12 67 10 4 54 87 32 76 32 87 0 - (6)out:36
禁止不开long long
1401:题目描述(成功写出)
在比赛中,根据范围,分析清楚变量的取值范围,是非常重要的。int 类型变量与 int 类型变量相乘,往往可能超出 int 类型可以表示的取值范围。
现在,给出两个 int 类型变量 x,y 及其取值范围,请问 x×y 的值是否可能超过 int 类型可以表示的范围?
提示:int 类型可以表示的范围为 [−2147483648,2147483647],也就是,int 类型可以表示的最小值为 −2147483648,最大值为 2147483647。
1401:AC代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
long long int x, y;
long long int a, b, c, d;
scanf("%lld %lld", &a, &b);
scanf("%lld %lld", &c, &d);
long long max_1 = abs(a) > abs(b) ? a : b;
long long max_2 = abs(c) > abs(d) ? c : d;
long long max = max_1 * max_2;
if (max > 0)
{
if (max > 2147483647)
{
printf("long long int\n");
}
else
{
printf("int\n");
}
return 0;
}
else
{
if (max < -2147483648)
{
printf("long long int\n");
}
else
{
printf("int\n");
}
return 0;
}
}
1401:学习成果
- 简单的比较,注意一点恒成立逻辑即可
原文地址:https://blog.csdn.net/m0_74983085/article/details/144308373
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!