【倒计时9day 22/155】

本文介绍了四个关于链表的操作,包括共享、逆转、重复数据删除和元素分类,并提供了相应的C++代码实现。同时,讨论了高精度计算问题,如多项式乘法和趣味数字的处理。涉及知识点包括链表模拟、排序、集合操作和进位制转换。

【倒计时10day 22/155】

第十三章链表

1032 Sharing 共享

#include<iostream>
using namespace std;
#define MaxN 100010
char e[MaxN];
int next1[MaxN];
bool visited[MaxN];
int main(){
    int add1,add2,N;
    scanf("%d %d %d",&add1,&add2,&N);
    for(int i=0;i<N;i++){
        int add,ne;
        char data;
        scanf("%d %c %d",&add,&data,&ne);
        e[add]=data;
        next1[add]=ne;
    }
    for(int i=add1;i!=-1;i=next1[i]){
        visited[i]=true;
    }
    for(int i=add2;i!=-1;i=next1[i]){
        if(visited[i]){
            printf("%05d\n",i);
            return 0;
        }
    }
    printf("-1\n");
    return 0;
}

1074 Reversing Linked List

注意点

1.用数组模拟链表
2.reverse(v.begin(),v.end())逆转函数
3.sort(v.begin()+1,v.end()
sort函数中的vector是用begin()表示不能sort(v+1,v+N);

Code

#include<iostream>
#include<vector>
#include<algorithm>
#define MaxN 100010
int data[MaxN],ne[MaxN];
using namespace std;

int main(){
    int startadd,N,K;
    scanf("%d %d %d",&startadd,&N,&K);
    for(int i=0;i<N;i++){
        int ad,num,next;
        scanf("%d%d%d",&ad,&num,&next);
        data[ad]=num;
        ne[ad]=next;
    }
    vector<int> v;
    for(int i=startadd;i!=-1;i=ne[i]){
        v.push_back(i);
    }
    for(int i=0;i+K-1<v.size();i+=K){
        reverse(v.begin()+i,v.begin()+i+K);
    }
    for(int i=0;i<v.size();i++){
        printf("%05d %d",v[i],data[v[i]]);
        if(i+1==v.size()){
            printf(" -1\n");
        }else{
            printf(" %05d\n",v[i+1]);
        }
    }
    return 0;
}

1097 Deduplication on a Linked List 链表重复数据删除

重要思路

利用unordered_set集合来判断是否有出现过

Code

#include<iostream>
#include<unordered_set>
#include<vector>
#define MaxN 100010
using namespace std;
int data[MaxN],ne[MaxN];
int main(){
    int startadd,N;
    scanf("%d %d",&startadd,&N);
    for(int i=0;i<N;i++){
        int ad,num,next;
        scanf("%d %d %d",&ad,&num,&next);
        data[ad]=num;
        ne[ad]=next;
    }
    vector<int> v,r;
    unordered_set<int> S;
    for(int i=startadd;i!=-1;i=ne[i]){
        if(S.count(data[i])==0&&S.count(-data[i])==0){
            S.insert(data[i]);
            v.push_back(i);
        }else{
            r.push_back(i);
        }
    }
    for(int i=0;i<v.size();i++){
        printf("%05d %d",v[i],data[v[i]]);
        if(i==v.size()-1){
            printf(" -1\n");
        }else{
            printf(" %05d\n",v[i+1]);
        }
    }
    for(int i=0;i<r.size();i++){
        printf("%05d %d",r[i],data[r[i]]);
        if(i==r.size()-1){
            printf(" -1\n");
        }else{
            printf(" %05d\n",r[i+1]);
        }
    }
    return 0;
}

1133 Splitting A Linked List链表元素分类

Code

#include<iostream>
#include<vector>
#define MaxN 100010
using namespace std;
int data[MaxN],ne[MaxN];
int main(){
    int startadd,N,K;
    scanf("%d%d%d",&startadd,&N,&K);
    for(int i=0;i<N;i++){
        int add,num,next;
        scanf("%d%d%d",&add,&num,&next);
        data[add]=num;
        ne[add]=next;
    }
    vector<int> v1,negative,lessK,moreK;
    for(int i=startadd;i!=-1;i=ne[i]){
        v1.push_back(i);
    }
    for(int i=0;i<v1.size();i++){
        if(data[v1[i]]<0){
            negative.push_back(v1[i]);
        }else if(data[v1[i]]>=0&&data[v1[i]]<=K){
            lessK.push_back(v1[i]);
        }else{
            moreK.push_back(v1[i]);
        }
    }
    bool first=true;
    for(int i=0;i<negative.size();i++){
        if(first){
            first=false;
        }else{
            printf(" %05d\n",negative[i]);
        }
        printf("%05d %d",negative[i],data[negative[i]]);
    }
    for(int i=0;i<lessK.size();i++){
        if(first){
            first=false;
        }else{
            printf(" %05d\n",lessK[i]);
        }
        printf("%05d %d",lessK[i],data[lessK[i]]);
    }
    for(int i=0;i<moreK.size();i++){
        if(first){
            first=false;
        }else{
            printf(" %05d\n",moreK[i]);
        }
        printf("%05d %d",moreK[i],data[moreK[i]]);
    }
    printf(" -1\n");
    return 0;
}

第二章高精度

int -2x109——2x109——9位
longlong -2x1018——2x1018——18位
大于18位的情况的加减等属于高精度计算

1009 Product of Polynomials(第一个测试点过不了)

我的代码:第一个测试点过不了,求大佬

#include<iostream>
#include<map>
#define epsilone 1E-15
using namespace std;
map<int,double,greater<int>> mp1,mp2,mp;
int main(){
    int K,exp;
    double col;
    for(int i=0;i<2;i++){
        scanf("%d",&K);
        for(int j=0;j<K;j++){
            scanf("%d %lf",&exp,&col);
            if(i==0){
                mp1[exp]=col;
            }else{
                mp2[exp]=col;
            }
        }
    }
    map<int,double,greater<int>>::iterator it1,it2,it;
    double col1,col2;
    int exp1,exp2;
    for(it1=mp1.begin();it1!=mp1.end();it1++){
        for(it2=mp2.begin();it2!=mp2.end();it2++){
            exp1=it1->first;
            exp2=it2->first;
            col1=it1->second;
            col2=it2->second;

                mp[exp1+exp2]+=col1*col2;

        }
    }
    cout<<mp.size();
    for(it=mp.begin();it!=mp.end();it++){
        printf(" %d %.1lf",it->first,it->second);
    }
    printf("\n");
    return 0;
}

根据y总代码重写的,主要注意printf double类型不是%d是%lf,其他都挺easy

#include<iostream>
#define MaxN 1010
using namespace std;
double A[MaxN],B[MaxN],C[2*MaxN];
int main(){
    int K1,K2,exp;
    double col;
    scanf("%d",&K1);
    for(int i=0;i<K1;i++){
        scanf("%d%lf",&exp,&col);
        A[exp]=col;
    }
    scanf("%d",&K2);
    for(int i=0;i<K2;i++){
        scanf("%d%lf",&exp,&col);
        B[exp]=col;
    }
    for(int i=0;i<MaxN;i++){
        for(int j=0;j<MaxN;j++){
            if(A[i]&&B[j]){
                C[i+j]+=A[i]*B[j];
            }
        }
    }
    int cnt=0;
    for(int i=0;i<2*MaxN;i++){
        if(C[i]){
            cnt++;
        }
    }
    printf("%d",cnt);
    for(int i=2*MaxN-1;i>=0;i--){
        if(C[i]){
            printf(" %d %.1lf",i,C[i]);
        }
    }
    printf("\n");
    return 0;
}

1023 Have Fun with Numbers 趣味数字

转换成数组,类似多项式
A0*A0+A1*A1
利用tag进行进位运算

易错点:
1.看清题目,无论yes或no都输出double后的number
2.最后一次判断完要额外看看有没有可能进多一位最高位

if(tag){
        b+=to_string(tag);
    }

3.string的sort用法和vector的一样
4.vector间也可以使用==
vector<int>a;
vector<int>b;
if(a==b){}…

#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
    string a;
    cin>>a;
    vector<int> v;
    for(int i=a.size()-1;i>=0;i--){
        v.push_back(a[i]-'0');//vec逆序存储
    }
    string b,c;
    int tag=0;
    for(int i=0;i<v.size();i++){
        int temp=v[i]+v[i]+tag;
        b+=to_string(temp%10);
        tag=temp/10;
    }
    if(tag){
        b+=to_string(tag);
    }
    c=b;
    sort(a.begin(),a.end());
    sort(b.begin(),b.end());
    reverse(c.begin(),c.end());
    if(a==b){
        printf("Yes\n");
    }else{
        printf("No\n");
    }
    printf("%s\n",c.c_str());
    return 0;
}

第三章进位制

1019 General Palindromic Number普通回文数

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main(){
    int N,b;
    scanf("%d%d",&N,&b);
    vector<int> a,t;
    if(!N) a.push_back(0);
    while(N){
        a.push_back(N%b);
        N/=b;
    }
    t=a;
    reverse(t.begin(),t.end());
    if(a==t){
        puts("Yes");
    }else{
        puts("No");
    }
    printf("%d",a[a.size()-1]);
    for(int i=a.size()-2;i>=0;i--){
        printf(" %d",a[i]);
    }
    printf("\n");
    return 0;
}
计价系统控制器设计 实验内容 Ø 基本要求(计价标准:起步价7元/3公里;里程费1.5元/公里;10公里以上里程费加收1元;等候费每分钟1元;23时至次日5时里程费上浮20%;假设轮胎周长2米): (1)直流电机转速四挡可调,可实现正反转。 (2)实时转速显示在数码管或VGA显示器上。 (3)实时显示里程、价格。 Ø 扩展要求: (1)  设计时钟,空载时显示当前时间,并可进行时、分、秒的设置; (2)  能够显示起步时间和结束时间。 (3)  能根据时钟自动完成日间、夜间计费模式的切换。 (4)  完成其他创新性设计。 实验原理 (1)计价系统控制器 计价系统控制器采用平台提供的FPGA核心板、电机模块、数码管或VGA显示器进行实验设计,系统包括显示控制模块、电机模块、计时模块、计程计价模块等,系统框图如图1所示。 (2)直流电机原理 输出或输入为直流电能的旋转电机,称为直流电机,它是能实现直流电能和机械能互相转换的电机。当它作电动机运行时是直流电动机,将电能转换为机械能;作发电机运行时是直流发电机,将机械能转换为电能。 PWM(脉冲宽度调制):通过控制固定电压的直流电源开关频率,从而改变负载两端的电压,进而达到控制要求的一种电压调整方法。 通过改变直流电机电枢上电压的“占空比”来改变电压的大小,从而控制电动机的转速。 实验步骤 (1)时钟分频模块 该模块通过不同模值的计数器对实验箱上的50MHz时钟频率进行分频,分别用于里程、价格、时间、速度、电机及显示模块的时钟信号。 其中,数码管属于低速设备,其正常的扫描频率为500~10KHz,扫描频率太快,会导致系统功耗增加,显示效果变暗。扫描频率太慢,会有明显的闪烁感。本实验通过调试观察,选择以2KHz作为扫描频率,实际显示效果比较好。若采用VGA显示可分频至约几十兆,使得VGA模块可以正常工作。 (2)电机模块 电机模块是通过接收控制模块所输出的控制信号作为其输入信号来改变电机的对应状态,实现控制模块想要达到的控制效果,即控制模块为中枢,通过电机模块来实现具体的操作。 (3)计程计价模块    电机转动时会持续产生一个脉冲信号CNTN,经消抖模块消抖后作为输入信号输入到路程模块中去,即路程模块是根据电机转动输出信号来进行计算路程的,规定电机转动一圈为两米;而计价模块是以路程模块输出的路程信号作为输入信号来计价的,当路程小于3km时总金额即为起步价,而当路程超过3km时,总金额则为起步价加上超过3km的部分*里程费,不足1km按1km算。 (4)计时模块 计时模块的主要功能是对系统工作时间进行计时,主要实现方式为利用分频模块得到的脉冲信号作为计数器的输入时钟信号,其中计数器分成了小时、分钟和秒三个模块,若计数秒到达60则分钟计数加1,若分钟计数到达60则小时计数加1,同时完成开始、暂停计时,结束计时等功能。 (5)显示控制模块 显示模块是将和出租车相关的关键参数(起步价、单价、行驶时间、路程、金额)及当前日期,星期几以扫描的方式显示在平台上的数码管或VGA显示屏上,该模块的时钟信号需匹配所选显示器件的扫描频率。若采用VGA显示屏,静态部分的显示内容可通过取相应的字模并在对应坐标进行扫描得到的,动态显示内容可通过对参数的判断来执行不同的显示字模操作,从而达到一个动态显示的效果。 (6)其他模块 完成设计可能还需用到消抖模块、调速及控制模块、时钟设置模块等。
06-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值