POJ 1654 Area

本文探讨了使用C++解决多边形面积计算问题的方法,通过叉乘计算有向面积并利用longlong类型避免精度误差,确保计算结果的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        这道题一咋看好简单,就是多边形求面积嘛,但是Wrong了很多次,看看discuss才知道用double有精度问题要用long long 或__int64,这就不明白了.不过换成long long之后就过了。不过有的人在纠结开数组的问题,这个问题不是问题。

贴贴代码把:

#include<iostream>
#include<cmath>
using namespace  std;
int d[10][2]={{0,0}, {-1,-1},{0,-1},{1,-1},{-1,0},{0,0},{1,0},{-1,1},{0,1},{1,1}};//方向
char str[1000005];
int len;
int Cross(int x1,int y1,int x2,int y2)
{
    return x1*y2-x2*y1;
}
int main()
{
    int t,p,x,y,i;
    long long sum;
    cin>>t;
    while( t--){
           cin>>str;
           if( str[0]=='5'){
               cout<<0<<endl;
               continue;
           }
           len=strlen(str);
           x=d[str[0]-'0'][0]; 
           y=d[str[0]-'0'][1];
           sum=0;
           for( i=1; str[i]!='5'; i++){
                p=str[i]-'0';
                sum+=Cross(x,y,x+d[p][0],y+d[p][1]);
                x+=d[p][0];
                y+=d[p][1];
           }
          if( sum<0)     //叉乘求出有向面积
              sum=-sum;
           cout<<sum/2;
           if( sum%2)   
               cout<<".5";
           cout<<endl;
    }
}


<think>好的,我现在需要帮助用户了解栈的基本操作以及与POJ相关的实现示例。首先,我要回顾栈的定义和基本操作,确保自己理解正确。栈是一种后进先出(LIFO)的数据结构,主要操作有push、pop、top、isEmpty和size。用户提到了POJ,可能是指北京大学的在线评测系统,所以需要提供相关的题目示例。 根据用户提供的引用内容,引用[2]和[3]详细说明了栈的基本操作和STL中的实现方式。特别是引用[3]中的代码示例,展示了如何使用C++的STL栈,包括头文件引入、定义栈、push、pop、top等操作。这可能对用户有帮助。 接下来,我需要考虑用户可能需要的POJ题目。常见的栈相关题目有括号匹配、表达式求值等。比如POJ 2559(直方图中最大的矩形),通常用单调栈解决,这也是引用[3]中提到的单调栈的应用。不过用户可能希望看到更基础的示例,比如括号匹配,这在POJ中可能有对应的题目,比如POJ 3991。 需要确保示例代码的正确性,并解释清楚每个步骤。同时,根据用户要求,所有行内数学表达式要用$...$,但这里可能涉及较少数学内容,主要关注代码和操作步骤。另外,需要生成相关问题,帮助用户进一步学习。 可能的问题点:用户是否熟悉C++的STL?是否需要其他语言的示例?但用户的问题中提到了POJ,通常使用C++较多,所以用C++示例是合适的。另外,需要确保引用的正确引用标识,比如在解释栈的应用时引用对应的文献。 最后,检查是否符合系统级指令,如格式、引用标识、问题生成等。确保回答结构清晰,分点说明,并包含代码示例和相关问题。</think>### 栈的基本操作与POJ实现示例 栈(Stack)是一种**后进先出(LIFO)**的线性数据结构,核心操作包括: 1. **`push`**:将元素压入栈顶,时间复杂度$O(1)$; 2. **`pop`**:移除栈顶元素,时间复杂度$O(1)$; 3. **`top`**:获取栈顶元素,时间复杂度$O(1)$; 4. **`isEmpty`**:判断栈是否为空; 5. **`size`**:返回栈中元素数量[^2][^3]。 --- ### 栈的C++ STL实现示例 ```cpp #include <iostream> #include <stack> using namespace std; int main() { stack<int> s; s.push(10); // 栈:10 s.push(20); // 栈:10 → 20 cout << "栈顶元素: " << s.top() << endl; // 输出20 s.pop(); // 移除20,栈顶变为10 cout << "栈大小: " << s.size() << endl; // 输出1 return 0; } ``` --- ### POJ相关题目实现示例 #### **POJ 2559: 直方图中最大矩形** **问题描述**:给定直方图的高度数组,计算其能形成的最大矩形面积。 **实现思路**:使用**单调栈**快速找到每个高度向左右扩展的边界[^3]。 ```cpp #include <cstdio> #include <stack> using namespace std; const int MAXN = 1e5+5; int height[MAXN]; long long maxArea(int n) { stack<int> s; long long max_area = 0; for (int i = 0; i <= n; i++) { while (!s.empty() && (i == n || height[s.top()] > height[i])) { int h = height[s.top()]; s.pop(); int width = s.empty() ? i : i - s.top() - 1; max_area = max(max_area, (long long)h * width); } s.push(i); } return max_area; } ``` --- #### **POJ 3991: 括号匹配** **问题描述**:给定字符串,判断其括号是否合法匹配。 **实现思路**:用栈记录未匹配的左括号,遇到右括号时弹出栈顶匹配。 ```cpp #include <cstdio> #include <stack> using namespace std; bool isValid(string s) { stack<char> stk; for (char c : s) { if (c == '(') stk.push(c); else if (c == ')') { if (stk.empty()) return false; stk.pop(); } } return stk.empty(); } ``` --- ### 栈的应用场景 1. **函数调用栈**:保存函数调用时的返回地址和局部变量; 2. **表达式求值**:中缀转后缀表达式,如计算$3 + 5 \times (2 - 6)$; 3. **撤销操作**:编辑器中的“撤销”功能依赖栈记录操作历史; 4. **浏览器历史记录**:通过栈实现前进/后退功能[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值