优先队列 | 北邮OJ | 108. 虚数

本文深入探讨了优先队列在算法竞赛题目中的应用,详细介绍了如何通过优先队列解决特定问题,包括运算符重载、大根堆实现及代码实例。适合对数据结构和算法有兴趣的读者。

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

https://vpn.bupt.edu.cn/http/10.105.242.80/problem/p/108/
看到本题要立刻想到用优先队列
牢记优先队列的运算符重载

/*
USER_ID: test#shizhuxiniubi
PROBLEM: 108
SUBMISSION_TIME: 2019-02-03 11:34:38
*/
#include <bits/stdc++.h>
#define FF(a,b) for(int a=0;a<b;a++)
#define F(a,b) for(int a=1;a<=b;a++)
#define LEN 100
#define INF 1000000
#define bug(x) cout<<#x<<"="<<x<<endl;
 
using namespace std;
typedef long long ll;
const double pi=acos(-1);
 
typedef struct Node{
    int x,y;
    double m;
    Node(int x=0,int y=0):x(x),y(y){
        m=sqrt(double(x*x+y*y));
    }
    void output(){
        printf("%d+i%d\n",x,y);
    }
    void input(){
        scanf("%d+i%d\n",&x,&y);
        m=sqrt(double(x*x+y*y));
    }
}Node;
 
struct cmp{
    bool operator () (const Node& a,const Node& b){//大根堆
        return a.m<b.m;
    }
};
priority_queue<Node,vector<Node>,cmp> pq;//大根堆
 
void output_size(){
    if(pq.size())
        printf("Size: %d\n",pq.size());
    else
        puts("Empty!");
}
 
int main()
{
//    freopen("./in","r",stdin);
    int T,N;
    char op[10];
    scanf("%d",&T);
 
    while(T--){
        while(pq.size())//初始化.在这个地方wa了
            pq.pop();
        scanf("%d",&N);
        while(N--){
            scanf("%s",op);
            if(op[0]=='P'){//Pop
                if(pq.size()){
                    Node u=pq.top();
                    pq.pop();
                    u.output();
                    output_size();
                }else puts("Empty!");
            }else{
                Node u;
                u.input();
                pq.push(u);
                output_size();
            }
 
        }
    }
    return 0;
}
<think>嗯,用户想找关于oj.icode8.cn这个Java在线题库的使用方法或题目解析。首先,我需要确认这个平台是否存在,或者是否可能有拼写错误。因为用户提到参考引用里有输入输出的问题,可能这个平台和机考相关,比如处理输入输出比较麻烦。 用户提到他们引用的内容是关于输入输出样题,90%的人失败在输入处理上。所以可能这个平台的题目需要特别注意输入输出的处理,这在Java中尤其重要,因为Java的输入方式相对复杂,比如Scanner和BufferedReader的区别。 接下来,我需要假设这个oj.icode8.cn是一个类似在线判题系统(OJ)的平台,类似于LeetCode或者牛客网。可能用户需要知道如何在这个平台上使用Java进行编程练习,包括如何正确读取输入,处理数据,以及输出结果。 首先,用户可能需要了解平台的基本使用方法,比如如何注册、如何选择题目、如何提交代码。其次,题目解析方面,可能需要给出一些常见题型的解题思路,尤其是输入输出的处理技巧,比如多行输入、循环读取等。 另外,考虑到Java在OJ中的常见问题,比如Scanner的效率问题,可能推荐使用BufferedReader来提高读取速度,尤其是在处理大数据量的时候。此外,还要注意类的命名,有些OJ要求主类必须为Main,否则会编译错误。 可能需要给出一个具体的例子,比如如何处理多行输入,如何解析字符串,转换成整数数组等。这些是常见的输入处理场景,用户可能在题目中经常遇到。 还要注意输出格式,比如末尾空格或换行符的问题,这些细节可能导致答案错误。需要提醒用户严格按照题目要求的格式输出。 此外,可能用户遇到的题目类型包括算法题、数据结构题等,需要针对不同的题型给出解析方法,比如排序、查找、动态规划等,并结合Java的特性进行实现。 最后,可能需要推荐一些资源,比如该平台的常见问题解答、讨论区,或者相关的Java编程技巧文章,帮助用户更好地使用这个平台。</think>关于Java在线题库oj.icode8.cn的使用方法及题目解析,以下是分步说明: 1. **平台访问与注册** - 访问官网oj.icode8.cn完成注册后,在题库分类中选择"Java专项" - 注意需使用JDK8及以上环境进行编程[^1] 2. **输入输出规范** ```java // 推荐使用BufferedReader提升读取效率 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] params = br.readLine().trim().split(" "); int n = Integer.parseInt(params[0]); // 输出注意末尾换行 System.out.println(result); ``` 3. **典型题目解析示例** **题目:二维数组对角线求和** ```java public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int[][] matrix = new int[n][n]; // 读取矩阵 for(int i=0; i<n; i++){ String[] row = br.readLine().split(" "); for(int j=0; j<n; j++){ matrix[i][j] = Integer.parseInt(row[j]); } } // 计算对角线 int sum = 0; for(int i=0; i<n; i++){ sum += matrix[i][i] + matrix[i][n-1-i]; } System.out.println(sum); } } ``` 4. **常见错误处理** - 数组越界:注意题目输入的索引范围 - 类型转换:使用`Integer.parseInt()`时需捕获`NumberFormatException` - 内存限制:避免使用过大的静态数组 5. **调试技巧** - 本地测试时创建`input.txt`文件模拟输入 - 使用`System.out.println()`中间输出调试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值