【倒计时9day 22/155】

【倒计时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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值