PAT的题目解析总结一

1001 A+B Format

to_string()函数的使用,可以使一个数字转换为字符串形式

将添加逗号的位置问题转换为数学问题:((i+1)%3==len%3)&&i!=len-1

1002 A+B for Polynomials

模拟题目:简单的多项式加法,可以使用数组存储,来一项,就加一项

1003 Emergency

Dijkstra算法,混合了最短路径的条数,以及点权问题。

            if(!vis[v]&&e[u][v]!=inf){
                if(e[u][v]+dis[u]<dis[v]){
                    dis[v]=e[u][v]+dis[u];
                    num[v]=num[u];
                    w[v]=w[u]+weight[v];
                }else if(e[u][v]+dis[u]==dis[v]){
                    num[v]+=num[u];
                    if(w[u]+weight[v]>w[v]){
                        w[v]=w[u]+weight[v];
                    }
                }

1004 Counting Leaves

每一层有多少个叶子节点

void dfs(int index,int depth){
    if(v[index].size()==0){
        book[depth]++;
        maxdepth=max(depth,maxdepth);
        return;
    }
    for(int i=0;i<v[index].size();++i){
        dfs(v[index][i],depth+1);
    }
}

1005 Spell It Right

水题

1006 Sign In and Sign Out

水题

1007 Maximum Subsequence Sum

最大子序列和,《数据结构与算法》C语言版上的第一道算法题,上面有三种解法🧐

    vector<int> v(n);
    int leftindex=0,rightindex=n-1,sum=-1,temp=0,tempIndex=0;
    for(int i=0;i<n;++i){
        cin>>v[i];
        temp+=v[i];
        if(temp<0){
            temp=0;
            tempIndex=i+1;
        }else if(temp>sum){
            sum=temp;
            leftindex=tempIndex;
            rightindex=i;
        }
    }

1008 Elevator

水题

1009 Product of Polynomials

译为多项式积

输入一个项就对全体数组都乘一遍

#include <iostream>
using namespace std;
int main(){
    int n1,n2,a,cnt=0;
    cin>>n1;
    double b,arr[1001]={0},ans[2001]={0};
    for(int i=0;i<n1;++i){
        cin>>a>>b;
        arr[a]=b;
    }
    cin>>n2;
    for(int i=0;i<n2;++i){
        cin>>a>>b;
        for(int j=0;j<1001;++j){
            ans[j+a]+=arr[j]*b;
        }
    }
    for(int i=2000;i>=0;--i){
        if(ans[i]!=0) ++cnt;
    }
    printf("%d",cnt);
    for(int i=2000;i>=0;--i){
        if(ans[i]!=0) printf(" %d %.1f",i,ans[i]);
    }
    return 0;
}

1010 Radix

难顶,我是一名保安,爱吃压缩饼干。

max_element(s.begin,s.end),用来查找区间内的最大值的地址,加上“*”号则表示对应地址的值。

#include <iostream>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std;
long long convert(string n,long long radix){
    long long sum=0;
    int index=0,temp=0;
    for(auto it=n.rbegin();it!=n.rend();++it){
        temp=isdigit(*it)?*it-'0':*it-'a'+10;
        sum+=temp*pow(radix,index++);
    }
    return sum;
}
long long find_radix(string n,long long num){
    char it=*max_element(n.begin(),n.end());
    long long low=(isdigit(it)?it-'0':it-'a'+10)+1;
    long long high=max(num,low);
    while(low<=high){
        long long mid=(low+high)/2;
        long long t=convert(n,mid);
        if(t<0||t>num) high=mid-1;
        else if(t==num) return mid;
        else low=mid+1;
    }
    return -1;
}
int main(){
    string n1,n2;
    long long tag=0,radix=0,result_radix;
    cin>>n1>>n2>>tag>>radix;
    result_radix=tag==1?find_radix(n2,convert(n1,radix)):
    find_radix(n1,convert(n2,radix));
    if(result_radix!=-1){
        printf("%lld",result_radix);
    }else printf("Impossible");
    return 0;
}

1011 World Cup Betting

水题

1012 The Best Rank

这又是麻烦题,最近考试考的越来越多了

#include <iostream>
#include <algorithm>
using namespace std;
struct node{
    int id,best;
    int score[4],rank[4];
}stu[2005];
int exist[1000000],flag=-1;
bool cmp1(node a,node b){
    return a.score[flag]>b.score[flag];
}
int main(){
    int n,m,id;
    cin>>n>>m;
    for(int i=0;i<n;++i){
        cin>>stu[i].id>>stu[i].score[1]>>stu[i].score[2]>>stu[i].score[3];
        stu[i].score[0]=(stu[i].score[1]+stu[i].score[2]+stu[i].score[3]+0.5)/3.0;
    }
    for(flag=0;flag<=3;++flag){
        sort(stu,stu+n,cmp1);
        stu[0].rank[flag]=1;
        for(int i=1;i<n;++i){
            stu[i].rank[flag]=i+1;
            if(stu[i].score[flag]==stu[i-1].score[flag]){
                stu[i].rank[flag]=stu[i-1].rank[flag];
            }
        }
    }
    for(int i=0;i<n;++i){
        exist[stu[i].id]=i+1;
        stu[i].best=0;
        int minn=stu[i].rank[0];
        for(int j=1;j<=3;++j){
            if(stu[i].rank[j]<minn){
                minn=stu[i].rank[j];
                stu[i].best=j;
            }
        }
    }
    char c[5]={'A','C','M','E'};
    for(int i=0;i<m;++i){
        cin>>id;
        int temp=exist[id];
        if(temp){
            int best=stu[temp-1].best;
            printf("%d %c\n",stu[temp-1].rank[best],c[best]);
        }else printf("N/A\n");
    }
    return 0;
}

1013 Battle Over Cities

检查图的连通块的个数—>常规做法就是并查集或者DFS,这里使用DFS,因为代码量小

#include <iostream>
#include <algorithm>
using namespace std;
int v[1010][1010];
bool visit[1010];
int n;
void dfs(int node){
    visit[node]=1;
    for(int i=1;i<=n;++i){
        if(!visit[i]&&v[node][i]==1){
            dfs(i);
        }
    }
}
int main(){
    int m,k,a,b;
    cin>>n>>m>>k;
    for(int i=0;i<m;++i){
        cin>>a>>b;
        v[a][b]=v[b][a]=1;
    }
    for(int i=0;i<k;++i){
        fill(visit,visit+1010,false);
        cin>>a;
        int cnt=0;
        visit[a]=1;
        for(int j=1;j<=n;++j){
            if(!visit[j]){
                dfs(j);
                ++cnt;
            }
        }
        printf("%d\n",cnt-1);
    }
    return 0;
}

1014 Waiting in Line

快乐模拟题?再见,有空在看

1015 Reversible Primes

#include <iostream>
using namespace std;
bool isPrime(int x){
    if(x<=1) return false;
    for(int i=2;i*i<=x;++i){
        if(x%i==0) return false;
    }
    return true;
}
int main(){
    int n,d;
    while(scanf("%d",&n)!=EOF){
        if(n<0) break;
        scanf("%d",&d);
        if(isPrime(n)==false){
            printf("No\n");
            continue;
        }
        int len=0,arr[100];
        do{
            arr[len++]=n%d;
            n/=d;
        }while(n!=0);
        for(int i=0;i<len;++i){
            n=n*d+arr[i];
        }
        printf("%s\n",isPrime(n)?"Yes":"No");
    }
    return 0;
}

1016 Phone Bills

排序题+麻烦题,麻烦题算是pat的传统了,这是陈越姥姥早期驯服PAT的珍贵资料

要有个清晰的思路,加上对map、string、set等STL的熟练掌握

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
struct node{
    string name;
    int status,month,time,day,hour,minute;
};
bool cmp(node a,node b){
    return a.name!=b.name?a.name<b.name:a.time<b.time;
}
double billFromZero(node call,int*rate){
    double total=rate[call.hour]*call.minute+rate[24]*60*call.day;
    for(int i=0;i<call.hour;++i){
        total+=rate[i]*60;
    }
    return total/100.0;
}
int main(){
    int rate[25]={0},n;
    for(int i=0;i<24;++i){
        scanf("%d",&rate[i]);
        rate[24]+=rate[i];
    }
    scanf("%d",&n);
    vector<node> data(n);
    for(int i=0;i<n;++i){
        cin>>data[i].name;
        scanf("%d:%d:%d:%d",&data[i].month,&data[i].day,&data[i].hour,&data[i].minute);
        string temp;
        cin>>temp;
        data[i].status=(temp=="on-line")?1:0;
        data[i].time=data[i].day*24*60+data[i].hour*60+data[i].minute;
    }
    sort(data.begin(),data.end(),cmp);
    map<string,vector<node>> custom;
    for(int i=1;i<n;++i){
        if(data[i].name==data[i-1].name&&data[i-1].status&&!data[i].status){
            custom[data[i-1].name].push_back(data[i-1]);
            custom[data[i].name].push_back(data[i]);
        }
    }
    for(auto it:custom){
        vector<node> temp=it.second;
        cout<<it.first;
        printf(" %02d\n",temp[0].month);
        double total=0;
        for(int i=1;i<temp.size();i+=2){
            double t=billFromZero(temp[i],rate)-billFromZero(temp[i-1],rate);
            printf("%02d:%02d:%02d %02d:%02d:%02d %d $%.2f\n",temp[i-1].day,
            temp[i-1].hour,temp[i-1].minute,temp[i].day,temp[i].hour,temp[i].minute,
            temp[i].time-temp[i-1].time,t);
            total+=t;
        }
        printf("Total amount: $%.2f\n",total);
    }
    return 0;
}

1017 Queueing at Bank

又是快乐模拟,溜了溜了

1018 Public Bike Management

这个Dijkstra太变态。。。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int inf=1e9;
int cmax,n,sp,m;
int minNeed=inf,minBack=inf;
int e[510][510],dis[510],weight[510];
bool vis[510];
vector<int> pre[510];
vector<int> path,temppath;
void dfs(int v){
    temppath.push_back(v);
    if(v==0){
        int need=0,back=0;
        for(int i=temppath.size()-1;i>=0;--i){
            int id=temppath[i];
            if(weight[id]>0){
                back+=weight[id];
            }else{
                if(back>(0-weight[id])){
                    back+=weight[id];
                }else{
                    need+=((0-weight[id])-back);
                    back=0;
                }
            }
        }
        if(need<minNeed){
            minNeed=need;
            minBack=back;
            path=temppath;
        }else if(need==minNeed&&back<minBack){
            minBack=back;
            path=temppath;
        }
        temppath.pop_back();
        return;
    }
    for(int i=0;i<pre[v].size();++i){
        dfs(pre[v][i]);
    }
    temppath.pop_back();
}
int main(){
    fill(e[0],e[0]+510*510,inf);
    fill(dis,dis+510,inf);
    cin>>cmax>>n>>sp>>m;
    for(int i=1;i<=n;++i){
        cin>>weight[i];
        weight[i]=weight[i]-cmax/2;
    }
    for(int i=0;i<m;++i){
        int a,b;
        cin>>a>>b;
        cin>>e[a][b];
        e[b][a]=e[a][b];
    }
    dis[0]=0;
    for(int i=0;i<=n;++i){
        int u=-1,minn=inf;
        for(int j=0;j<=n;++j){
            if(!vis[j]&&dis[j]<minn){
                minn=dis[j];
                u=j;
            }
        }
        if(u==-1) break;
        vis[u]=1;
        for(int v=0;v<=n;++v){
            if(!vis[v]&&e[u][v]!=inf){
                if(dis[v]>e[u][v]+dis[u]){
                    dis[v]=e[u][v]+dis[u];
                    pre[v].clear();
                    pre[v].push_back(u);
                }else if(dis[v]==e[u][v]+dis[u]){
                    pre[v].push_back(u);
                }
            }
        }
    }
    dfs(sp);
    printf("%d 0",minNeed);
    for(int i=path.size()-2;i>=0;--i){
        printf("->%d",path[i]);
    }
    printf(" %d",minBack);
    return 0;
}

1019 General Palindromic Number

回文串的基本操作

#include <iostream>
using namespace std;
int main(){
    int a,b;
    cin>>a>>b;
    int arr[40],index=0;
    while(a!=0){
        arr[index++]=a%b;
        a/=b;
    }
    int flag=0;
    for(int i=0;i<index/2;++i){
        if(arr[i]!=arr[index-i-1]){
            printf("No\n");
            flag=1;
            break;
        }
    }
    if(!flag) printf("Yes\n");
    for(int i=index-1;i>=0;--i){
        printf("%d",arr[i]);
        if(i!=0) printf(" ");
    }
    if(index==0) printf("0");
    return 0;
}

1020 Tree Traversals

这个是典型具有柳神建树气息的代码。

while函数在中序遍历中根节点的位置,最后end-i为右节点的个数,i-start为左节点的个数。

所以,建立左树时,左根节点是现在的位置减去右节点的个数-1,root-end+i-1。

其余的懂得都懂

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct node{
    int index,value;
};
bool cmp(node a,node b){
    return a.index<b.index;
}
vector<int> post,in;
vector<node> ans;
void pre(int root,int start,int end,int index){
    if(start>end) return;
    int i=start;
    while(i<end&&in[i]!=post[root]) ++i;
    ans.push_back({index,post[root]});
    pre(root-1-end+i,start,i-1,2*index+1);
    pre(root-1,i+1,end,2*index+2);
}
int main(){
    int n;
    cin>>n;
    post.resize(n);
    in.resize(n);
    for(int i=0;i<n;++i) cin>>post[i];
    for(int i=0;i<n;++i) cin>>in[i];
    pre(n-1,0,n-1,0);
    sort(ans.begin(),ans.end(),cmp);
    for(int i=0;i<ans.size();++i){
        if(i!=0) cout<<" ";
        cout<<ans[i].value;
    }
    return 0;
}

1021 Deepest Root

两次dfs,所求最高的叶子节点,即为所求

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
int n,maxheight=0;
vector<vector<int>> v;
bool vis[10010];
set<int> s;
vector<int> temp;
void dfs(int node,int height){
    if(height>maxheight){
        temp.clear();
        temp.push_back(node);
        maxheight=height;
    }else if(height==maxheight){
        temp.push_back(node);
    }
    vis[node]=1;
    for(int i=0;i<v[node].size();++i){
        if(!vis[node][i]) dfs(v[node][i],height+1);
    }
}
int main(){
    cin>>n;
    v.resize(n+1);
    int a,b,cnt=0,s1=0;
    for(int i=0;i<n-1;++i){
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    for(int i=1;i<=n;++i){
        if(!vis[i]){
            dfs(i,1);
            if(i==1){
                if(temp.size()!=0) s1=temp[0];
                for(int j=0;j<temp.size();++j){
                    s.insert(temp[j]);
                }
            }
            ++cnt;
        }
    }
    if(cnt>=2){
        printf("Error: %d components",cnt);
    }else{
        temp.clear();
        maxheight=0;
        fill(vis,vis+10010,false);
        dfs(s1,1);
        for(int i=0;i<temp.size();++i){
            s.insert(temp[i]);
        }
        for(auto it=s.begin();it!=s.end();++it){
            printf("%d\n",*it);
        }
    }
    return 0;
}

1022 Digital Library

map排序复杂题

#include <iostream>
#include <map>
#include <set>
using namespace std;
map<string,set<int>> title,author,key,pub,year;
void query(map<string,set<int>>&m,string&str){
    if(m.find(str)!=m.end()){
        for(auto it=m[str].begin();it!=m[str].end();++it){
            printf("%07d\n",*it);
        }
    }else{
        cout<<"Not Found\n";
    }
}
int main(){
    int n,m,id,num;
    cin>>n;
    string ttitle,tauthor,tkey,tpub,tyear;
    for(int i=0;i<n;++i){
        scanf("%d\n",&id);
        getline(cin,ttitle);
        title[ttitle].insert(id);
        getline(cin,tauthor);
        author[tauthor].insert(id);
        while(cin>>tkey){
            key[tkey].insert(id);
            char c=getchar();
            if(c=='\n') break;
        }
        getline(cin,tpub);
        pub[tpub].insert(id);
        getline(cin,tyear);
        year[tyear].insert(id);
    }
    cin>>m;
    for(int i=0;i<m;++i){
        scanf("%d: ",&num);
        string temp;
        getline(cin,temp);
        cout<<num<<": "<<temp<<"\n";
        if(num==1) query(title,temp);
        else if(num==2) query(author,temp);
        else if(num==3) query(key,temp);
        else if(num==4) query(pub,temp);
        else if(num==5) query(year,temp);
    }
    return 0;
}

1023 Have Fun with Numbers

#include <iostream>
#include <cstring>
using namespace std;
int book[10];
int main(){
    char num[22];
    scanf("%s",num);
    int flag=0,len=strlen(num);
    for(int i=len-1;i>=0;--i){
        int temp=num[i]-'0';
        ++book[temp];
        temp=temp*2+flag;
        flag=0;
        if(temp>=10){
            temp=temp-10;
            flag=1;
        }
        num[i]=temp+'0';
        --book[temp];
    }
    int flag1=0;
    for(int i=0;i<10;++i){
        if(book[i]!=0) flag1=1;
    }
    printf("%s",(flag==1||flag1==1)?"No\n":"Yes\n");
    if(flag==1) printf("1");
    printf("%s",num);
    return 0;
}

1024 Palindromic Number

string用于解决回文串真是优秀啊

#include <iostream>
#include <algorithm>
using namespace std;
string s;
void add(string t){
    int len=s.length(),carry=0;
    for(int i=0;i<len;++i){
        s[i]=s[i]+t[i]+carry-'0';
        carry=0;
        if(s[i]>'9'){
            s[i]=s[i]-10;
            carry=1;
        }
    }
    if(carry) s+='1';
    reverse(s.begin(),s.end());
}
int main(){
    int cnt,i;
    cin>>s>>cnt;
    for(i=0;i<=cnt;++i){
        string t=s;
        reverse(t.begin(),t.end());
        if(s==t||i==cnt) break;
        add(t);
    }
    cout<<s<<endl<<i;
    return 0;
}

1025 PAT Ranking

排序题

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct student{
    long long int no;
    int score,finrank,loca,locarank;
};
bool cmp(student a,student b){
    return a.score!=b.score?a.score>b.score:a.no<b.no;
}
int main(){
    int n,m;
    cin>>n;
    vector<student> fin;
    for(int i=1;i<=n;++i){
        cin>>m;
        vector<student> v(m);
        for(int j=0;j<m;++j){
            cin>>v[j].no>>v[j].score;
            v[j].loca=i;
        }
        sort(v.begin(),v.end(),cmp);
        v[0].locarank=1;
        fin.push_back(v[0]);
        for(int j=1;j<m;++j){
            v[j].locarank=(v[j].score==v[j-1].score)?v[j-1].locarank:j+1;
            fin.push_back(v[j]);
        }
    }
    sort(fin.begin(),fin.end(),cmp);
    fin[0].finrank=1;
    for(int j=1;j<fin.size();++j){
        fin[j].finrank=(fin[j].score==fin[j-1].score)?fin[j-1].finrank:j+1;
    }
    printf("%d\n",fin.size());
    for(int i=0;i<fin.size();++i){
        printf("%013lld %d %d %d\n",fin[i].no,fin[i].finrank,fin[i].loca,fin[i].locarank);
    }
    return 0;
}

1026 Table Tennis

溜了

1027 Colors in Mars

#include <iostream>
using namespace std;
int main(){
    char c[14]={"0123456789ABC"};
    printf("#");
    for(int i=0;i<3;++i){
        int num;
        cin>>num;
        printf("%c%c",c[num/13],c[num%13]);
    }
    return 0;
}

1028 List Sorting

简单排序题

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=100001;
struct node{
    int no,score;
    char name[10];
}nodes[maxn];
int c;
bool cmp(node a,node b){
    if(c==1) return a.no<b.no;
    else if(c==2){
        if(strcmp(a.name,b.name)==0) return a.no<b.no;
        else strcmp(a.name,b.name)<=0;
    }else{
        if(a.score==b.score) return a.no<b.no;
        else return a.score<=b.score;
    }
}
int main(){
    int n;
    cin>>n>>c;
    for(int i=0;i<n;++i){
        cin>>nodes[i].no>>nodes[i].name>>nodes[i].score;
    }
    sort(nodes,nodes+n,cmp);
    for(int i=0;i<n;++i){
        printf("%06d %s %d\n",nodes[i].no,nodes[i].name,nodes[i].score);
    }
    return 0;
}

1029 Median

指针解法无敌!

#include <iostream>
using namespace std;
int k[200005];
int main(){
    int n,m,temp,count=0;
    cin>>n;
    for(int i=1;i<=n;++i){
        cin>>k[i];
    }
    k[n+1]=0x7fffffff;
    cin>>m;
    int midpos=(n+m+1)/2,i=1;
    for(int j=1;j<=m;++j){
        scanf("%d",&temp);
        while(k[i]<temp){
            ++count;
            if(count==midpos) cout<<k[i];
            ++i;
        }
        ++count;
        if(count==midpos) cout<<temp;
    }
    while(i<=n){
        ++count;
        if(count==midpos) cout<<k[i];
        ++i;
    }
    return 0;
}

1030 Travel Plan

Dijkstra的边权以及路径保存

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n,m,s,d;
int e[510][510],dis[510],cost[510][510];
vector<int> pre[510];
bool vis[510];
const int inf=1e9;
vector<int> path,temppath;
int mincost=inf;
void dfs(int v){
    temppath.push_back(v);
    if(v==s){
        int tempcost=0;
        for(int i=temppath.size()-1;i>0;--i){
            int id=temppath[i],nextid=temppath[i-1];
            tempcost+=cost[id][nextid];
        }
        if(tempcost<mincost){
            mincost=tempcost;
            path=temppath;
        }
        temppath.pop_back();
        return;
    }
    for(int i=0;i<pre[v].size();++i){
        dfs(pre[v][i]);
    }
    temppath.pop_back();
}
int main(){
    fill(e[0],e[0]+510*510,inf);
    fill(dis,dis+510,inf);
    cin>>n>>m>>s>>d;
    for(int i=0;i<m;++i){
        int a,b;
        cin>>a>>b;
        cin>>e[a][b]>>cost[a][b];
        e[b][a]=e[a][b];
        cost[b][a]=cost[a][b];
    }
    pre[s].push_back(s);
    dis[s]=0;
    for(int i=0;i<n;++i){
        int u=-1,minn=inf;
        for(int j=0;j<n;++j){
            if(!vis[j]&&dis[j]<minn){
                u=j;
                minn=dis[j];
            }
        }
        if(u==-1) break;
        vis[u]=1;
        for(int v=0;v<n;++v){
            if(!vis[v]&&e[u][v]!=inf){
                if(dis[v]>dis[u]+e[u][v]){
                    dis[v]=dis[u]+e[u][v];
                    pre[v].clear();
                    pre[v].push_back(u);
                }else if(dis[v]==dis[u]+e[u][v]){
                    pre[v].push_back(u);
                }
            }
        }
    }
    dfs(d);
    for(int i=path.size()-1;i>=0;--i){
        printf("%d ",path[i]);
    }
    printf("%d %d",dis[d],mincost);
    return 0;
}

1031 Hello World for U

数学问题

#include <iostream>
#include <cstring>
using namespace std;
int main(){
    char c[81],u[30][30];
    memset(u,' ',sizeof(u));
    scanf("%s",c);
    int n=strlen(c)+2;
    int n1=n/3,n2=n/3+n%3,index=0;
    for(int i=0;i<n1;++i) u[i][0]=c[index++];
    for(int i=1;i<=n2-2;++i) u[n1-1][i]=c[index++];
    for(int i=n1-1;i>=0;--i) u[i][n2-1]=c[index++];
    for(int i=0;i<n1;++i){
        for(int j=0;j<n2;++j){
            printf("%c",u[i][j]);
        }
        printf("\n");
    }
    return 0;
}

1032 Sharing

优秀!

#include <iostream>
using namespace std;
struct node{
    char key;
    int next;
    bool flag;
}nodes[100000];
int main(){
    int s1,s2,n,a,b;
    cin>>s1>>s2>>n;
    char data;
    for(int i=0;i<n;++i){
        cin>>a>>data>>b;
        nodes[a]={data,b,false};
    }
    for(int i=s1;i!=-1;i=nodes[i].next){
        nodes[i].flag=1;
    }
    for(int i=s2;i!=-1;i=nodes[i].next){
        if(nodes[i].flag){
            printf("%05d",i);
            return 0;
        }
    }
    printf("-1");
    return 0;
}

1033 To Fill or Not to Fill

这题也太难了😤

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int inf=1e9;
struct station{
    double price,dis;
};
bool cmp(station a,station b){
    return a.dis<b.dis;
}
int main(){
    double cmax,d,davg;
    int n;
    cin>>cmax>>d>>davg>>n;
    vector<station> sta(n+1);
    sta[0]={0,d};
    for(int i=1;i<=n;++i){
        cin>>sta[i].price>>sta[i].dis;
    }
    sort(sta.begin(),sta.end(),cmp);
    double nowdis=0,maxdis=0,nowprice=0,totalprice=0,leftdis=0;
    if(sta[0].dis!=0){
        printf("The maximum travel distance = 0.00\n");
        return 0;
    }else{
        nowprice=sta[0].price;
    }
    while(nowdis<d){
        maxdis=nowdis+cmax*davg;
        double minPriceDis=0,minPrice=inf;
        bool flag=0;
        for(int i=1;i<=n&&sta[i].dis<=maxdis;++i){
            if(sta[i].dis<=nowdis) continue;
            if(sta[i].price<nowprice){
                totalprice+=(sta[i].dis-nowdis-leftdis)*nowprice/davg;
                leftdis=0;
                nowprice=sta[i].price;
                nowdis=sta[i].dis;
                flag=1;
                break;
            }
            if(sta[i].price<minPrice){
                minPrice=sta[i].price;
                minPriceDis=sta[i].dis;
            }
        }
        if(!flag&&minPrice!=inf){
            totalprice+=(nowprice*(cmax-leftdis/davg));
            leftdis=cmax*davg-(minPriceDis-nowdis);
            nowprice=minPrice;
            nowdis=minPriceDis;
        }
        if(!flag&&minPrice==inf){
            nowdis+=cmax*davg;
            printf("The maximum travel distance = %.2f\n",nowdis);
            return 0;
        }
    }
    printf("%.2f\n",totalprice);
    return 0;
}

1034 Head of a Gang

#include <iostream>
#include <map>
using namespace std;
map<string,int> stringToInt;
map<int,string> intToString;
map<string,int> ans;
int idNumber=1,k;
int stoifunc(string s){
    if(stringToInt[s]==0){
        stringToInt[s]=idNumber;
        intToString[idNumber]=s;
        return idNumber++;
    }else{
        return stringToInt[s];
    }
}
int g[2010][2010],weight[2010];
bool vis[2010];
void dfs(int u,int&head,int&numMember,int&totalWeight){
    vis[u]=1;
    ++numMember;
    if(weight[u]>weight[head]){
        head=u;
    }
    for(int v=1;v<idNumber;++v){
        if(g[u][v]>0){
            totalWeight+=g[u][v];
            g[u][v]=g[v][u]=0;
            if(!vis[v]){
                dfs(v,head,numMember,totalWeight);
            }
        }
    }
}
void dfsTrave(){
    for(int i=1;i<idNumber;++i){
        if(!vis[i]){
            int head=i,numMember=0,totalWeight=0;
            dfs(i,head,numMember,totalWeight);
            if(numMember>2&&totalWeight>k){
                ans[intToString[head]]=numMember;
            }
        }
    }
}
int main(){
    int n,w;
    cin>>n>>k;
    string s1,s2;
    for(int i=0;i<n;++i){
        cin>>s1>>s2>>w;
        int id1=stoifunc(s1);
        int id2=stoifunc(s2);
        weight[id1]+=w;
        weight[id2]+=w;
        g[id1][id2]+=w;
        g[id2][id1]+=w;
    }
    dfsTrave();
    cout<<ans.size()<<"\n";
    for(auto it=ans.begin();it!=ans.end();++it){
        cout<<it->first<<" "<<it->second<<"\n";
    }
    return 0;
}

1035 Password

名字和要变的密码一块弄进string太秀了

#include <iostream>
#include <vector>
using namespace std;
int main(){
    int n;
    cin>>n;
    vector<string> v;
    for(int i=0;i<n;++i){
        string name,s;
        cin>>name>>s;
        int len=s.length(),flag=0;
        for(int j=0;j<len;++j){
            switch(s[j]){
                case '1':s[j]='@';flag=1;break;
                case '0':s[j]='\%';flag=1;break;
                case 'l':s[j]='L';flag=1;break;
                case 'O':s[j]='o';flag=1;break;
            }
        }
        if(flag){
            string temp=name+" "+s;
            v.push_back(temp);
        }
    }
    int cnt=v.size();
    if(cnt!=0){
        cout<<cnt<<"\n";
        for(int i=0;i<cnt;++i){
            cout<<v[i]<<endl;
        }
    }else if(n==1){
        printf("There is 1 account and no account is modified\n");
    }else{
        printf("There are %d account and no account is modified\n",n);
    }
    return 0;
}

1036 Boys vs Girls

#include <iostream>
using namespace std;
int main(){
    int n;
    cin>>n;
    string female,male;
    int femalescore=-1,malescore=101;
    for(int i=0;i<n;++i){
        string name,sex,num;
        int score;
        cin>>name>>sex>>num>>score;
        if(sex=="F"){
            if(femalescore<score){
                femalescore=score;
                female=name+" "+num;
            }
        }else if(malescore>score){
            malescore=score;
            male=name+" "+num;
        }
    }
    if(femalescore==-1){
        printf("Absent\n");
    }else cout<<female<<endl;
    if(malescore==101){
        printf("Absent\n");
    }else cout<<male<<endl;
    if(femalescore!=-1&&malescore!=101){
        printf("%d",femalescore-malescore);
    }else printf("NA");
    return 0;
}

1037 Magic Coupon

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    int m,n,ans=0,p=0,q=0;
    cin>>m;
    vector<int> v1(m);
    for(int i=0;i<m;++i) cin>>v1[i];
    cin>>n;
    vector<int> v2(n);
    for(int i=0;i<n;++i) cin>>v2[i];
    sort(v1.begin(),v1.end());
    sort(v2.begin(),v2.end());
    while(p<m&&q<n&&v1[p]<0&&v2[q]<0){
        ans+=v1[p]*v2[q];
        ++p;++q;
    };
    p=m-1,q=n-1;
    while(p>=0&&q>=0&&v1[p]>0&&v2[q]>0){
        ans+=v1[p]*v2[q];
        --p;--q;
    }
    printf("%d",ans);
    return 0;
}

1038 Recover the Smallest Number

string的排序实在太妙了

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
bool cmp(string a,string b){
    return a+b<b+a;
}
string str[10010];
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;++i) cin>>str[i];
    sort(str,str+n,cmp);
    string s;
    for(int i=0;i<n;++i) s+=str[i];
    while(s.length()!=0&&s[0]=='0') s.erase(s.begin());
    if(s.length()==0) cout<<0;
    cout<<s;
    return 0;
}

1039 Course List for Student

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int getid(char*name){
    int id=0;
    for(int i=0;i<3;++i){
        id=26*id+name[i]-'A';
    }
    id=id*10+name[3]-'0';
    return id;
}
const int maxn=26*26*26*10+10;
vector<int> v[maxn];
int main(){
    int n,k,no,num,id=0;
    char name[5];
    cin>>n>>k;
    for(int i=0;i<k;++i){
        cin>>no>>num;
        for(int i=0;i<num;++i){
            cin>>name;
            id=getid(name);
            v[id].push_back(no);
        }
    }
    for(int i=0;i<n;++i){
        cin>>name;
        id=getid(name);
        sort(v[id].begin(),v[id].end());
        cout<<name<<" "<<v[id].size();
        for(int j=0;j<v[id].size();++j){
            printf(" %d",v[id][j]);
        }
        printf("\n");
    }
    return 0;
}

1040 Longest Symmetric String

再见

1041 Be Unique

#include <iostream>
using namespace std;
int a[100001],m[100000];
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;++i){
        cin>>a[i];
        m[a[i]]++;
    }
    for(int i=0;i<n;++i){
        if(m[a[i]]==1){
            printf("%d",a[i]);
            return 0;
        }
    }
    printf("None");
    return 0;
}

1042 Shuffling Machine

#include <iostream>
using namespace std;
int main(){
    int cnt;
    cin>>cnt;
    int start[55],end[55],scan[55];
    for(int i=1;i<55;++i){
        cin>>scan[i];
        end[i]=i;
    }
    for(int i=0;i<cnt;++i){
        for(int j=1;j<55;++j){
            start[j]=end[j];
        }
        for(int k=1;k<55;++k){
            end[scan[k]]=start[k];
        }
    }
    char c[6]={"SHCDJ"};
    for(int i=1;i<55;++i){
        end[i]=end[i]-1;
        printf("%c%d",c[end[i]/13],end[i]%13+1);
        if(i!=54) printf(" ");
    }
    return 0;
}

1043 Is It a Binary Search Tree

不愧是柳神,写的代码就是稳

#include <iostream>
#include <vector>
using namespace std;
bool isMirror;
vector<int> pre,post;
void getpost(int root,int tail){
    if(root>tail) return;
    int i=root+1,j=tail;
    if(!isMirror){
        while(i<=tail&&pre[root]>pre[i]) ++i;
        while(j>root&&pre[root]<=pre[j]) --j;
    }else{
        while(i<=tail&&pre[root]<=pre[i]) ++i;
        while(j>root&&pre[root]>pre[j]) --j;
    }
    if(i-j!=1) return;
    getpost(root+1,j);
    getpost(i,tail);
    post.push_back(pre[root]);
}
int main(){
    int n;
    cin>>n;
    pre.resize(n);
    for(int i=0;i<n;++i) cin>>pre[i];
    getpost(0,n-1);
    if(post.size()!=n){
        isMirror=true;
        post.clear();
        getpost(0,n-1);
    }
    if(post.size()==n){
        printf("YES\n%d",post[0]);
        for(int i=1;i<n;++i) printf(" %d",post[i]);
    }else{
        printf("NO");
    }
    return 0;
}

1044 Shopping in Mars

二分查找

#include <iostream>
#include <vector>
using namespace std;
vector<int> sum,resultArr;
int n,m;
void Func(int i,int&j,int&tempsum){
    int left=i,right=n;
    while(left<right){
        int mid=(left+right)/2;
        if(sum[mid]-sum[i-1]>=m){
            right=mid;
        }else left=mid+1;
    }
    j=right;
    tempsum=sum[j]-sum[i-1];
}
int main(){
    cin>>n>>m;
    sum.resize(n+1);
    for(int i=1;i<=n;++i){
        cin>>sum[i];
        sum[i]+=sum[i-1];
    }
    int minans=sum[n];
    for(int i=1;i<=n;++i){
        int j,tempsum;
        Func(i,j,tempsum);
        if(tempsum>minans) continue;
        if(tempsum>=m){
            if(tempsum<minans){
                resultArr.clear();
                minans=tempsum;
            }
            resultArr.push_back(i);
            resultArr.push_back(j);
        }
    }
    for(int i=0;i<resultArr.size();i+=2){
        printf("%d-%d\n",resultArr[i],resultArr[i+1]);
    }
    return 0;
}

1045 Favorite Color Stripe

溜了

1046 Shortest Distance

简单模拟问题,环路长度的最小值

#include <iostream>
#include <vector>
using namespace std;
int main(){
    int n;
    cin>>n;
    vector<int> dis(n+1);
    int sum=0,left,right,cnt;
    for(int i=1;i<=n;++i){
        int temp;
        scanf("%d",&temp);
        sum+=temp;
        dis[i]=sum;
    }
    cin>>cnt;
    for(int i=0;i<cnt;++i){
        cin>>left>>right;
        if(left>right){
            swap(left,right);
        }
        int temp=dis[right-1]-dis[left-1];
        printf("%d\n",min(temp,sum-temp));
    }
    return 0;
}

1047 Student List for Course

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
char name[40010][5];
vector<int> course[2510];
bool cmp(int a,int b){
    return strcmp(name[a],name[b])<0;
}
int main(){
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;++i){
        int cnt,temp;
        cin>>name[i]>>cnt;
        for(int j=0;j<cnt;++j){
            cin>>temp;
            course[temp].push_back(i);
        }
    }
    for(int i=1;i<=k;++i){
        printf("%d %d\n",i,course[i].size());
        sort(course[i].begin(),course[i].end(),cmp);
        for(int j=0;j<course[i].size();++j){
            printf("%s\n",name[course[i][j]]);
        }
    }
    return 0;
}

1048 Find Coins

#include <iostream>
using namespace std;
int a[1001];
int main(){
    int n,m,temp;
    cin>>n>>m;
    for(int i=0;i<n;++i){
        cin>>temp;
        a[temp]++;
    }
    for(int i=0;i<1001;++i){
        if(a[i]){
            a[i]--;
            if(m>i&&a[m-i]){
                printf("%d %d",i,m-i);
                return 0;
            }
            a[i]++;
        }
    }
    printf("No Solution");
    return 0;
}

1049 Counting Ones

数学问题

#include <iostream>
using namespace std;
int main(){
    int n,left=0,right=0,a=1,now=1,ans=0;
    cin>>n;
    while(n/a){
        left=n/(a*10),now=n/a%10,right=n%a;
        if(now==0) ans+=left*a;
        else if(now==1) ans+=left*a+right+1;
        else ans+=(left+1)*a;
        a*=10;
    }
    printf("%d",ans);
    return 0;
}

1050 String Subtraction

转换为hash问题

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
char s1[100000],s2[100000];
int main(){
    cin.getline(s1,100000);
    cin.getline(s2,100000);
    int len1=strlen(s1),len2=strlen(s2);
    bool flag[256]={0};
    for(int i=0;i<len2;++i){
        flag[s2[i]]=1;
    }
    for(int i=0;i<len1;++i){
        if(!flag[s1[i]]){
            printf("%c",s1[i]);
        }
    }
    return 0;
}
posted @ 2020-09-03 22:35  sszz_w  阅读(127)  评论(0编辑  收藏  举报