PAT1133


title: PAT1133
date: 2021-01-22 20:03:07
tags: PAT


1133

题目:

链表分割成三部分,一部分比零小的,一部分比一个特定值小的,一部分比特定值大的,且分完后顺序不能改变

范围:

最多 10^5 个节点

分析:

  1. 链表乱序输入
  2. 不一定链表包含所有节点所以链表存储要注意提前退出,否则可能报段错误
  3. 比较方式是小于和大于等于

解法:

  • 顺序存储
  • 扫描三次,依次挑出来添加入队列
  • 输出队列元素和他们的地址,以及下一个的地址

代码:

#include<iostream>
#include<map>
#include<string>
#include<vector>

using namespace std; 

struct val
{
    /* data */
    int val; 
    string add; 
    string to; 
};


val negative[100005], less_line[100005], better_line[100005]; 
map<string, val> list; 
val num[100005];
vector<val> num_range;  


int main(){
    freopen("./1133_in","r",stdin); //提交时把这行注释掉就行
    string a, c, start;
    int b, n, line; 
    
    int j = 0, k = 0, l = 0, count = 0; //j: neg, k: less than k, l: better than line
    cin>>start>>n>>line; 
    for(int i = 0; i < n; i++){
        cin>>a>>b>>c; 
        val tmp_val = {b, a, c}; 
        list[a] = tmp_val; 
    }
    for(int i = 0; i < n; i++){
        num[i] = list[start]; 
        start = list[start].to;
        if(start == "-1") {
            count = i+1; 
            break; 
        }
    }
    for(int i = 0 ; i < count; i++){
        if(num[i].val < 0){
            negative[j] = num[i]; 
            j++;            
        }
        else if(num[i].val <= line){
            less_line[k] = num[i];
            k++; 
        }
        else{
            better_line[l] = num[i]; 
            l++;
        }
    }
    for(int i = 0; i < count; i++){
        if(i < j){
            num[i] = negative[i]; 
        }
        else if(i < j + k){
            num[i] = less_line[i - j]; 
        }
        else {
            num[i] = better_line[i - j - k]; 
        }
    }
    for(int i = 0; i < count; i++){
        // cout<<num[i].add<<" "<<num[i].val<<" "; 
        printf("%s %d ", num[i].add.c_str(), num[i].val); 
        if(i == count - 1) printf("-1\n"); 
        else printf("%s\n", num[i+1].add.c_str()); 
    }

    // for(int i = 0; i < n; i++){
    //     if(num[i].val < 0) num_range.push_back(num[i]);
    // }
    // for(int i = 0; i < n; i++){
    //     if(num[i].val >= 0 && num[i].val <= line) num_range.push_back(num[i]);
    // }
    // for(int i = 0; i < n; i++){
    //     if(num[i].val > line) num_range.push_back(num[i]);
    // }
    // for(int i = 0; i < n; i++){
    //     if(i == n - 1) cout<<num_range[i].add<<" "<<num_range[i].val<<" "<<"-1"<<endl; 
    //     else cout<<num_range[i].add<<" "<<num_range[i].val<<" "<<num_range[i+1].add<<endl; 
    // }
    
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容