PAT 2016年浙大复试机试

本文涵盖了四个编程问题的解决方案,包括处理卡住的键盘输入,实现整数集合的划分,计算家庭成员的属性以及在二叉搜索树中统计节点数量。这些问题涉及字符串处理、排序、并查集和广度优先搜索等算法技巧。

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

1 PAT 甲级 1112 Stucked Keyboard

#include <bits/stdc++.h>
using namespace std;
int num[256];
bool broken[256];
int main() {
    fill(broken,broken+256,true);
    int n;cin>>n;
    string s;cin>>s;
    char old,now;
    for(size_t i=0;i<s.size();++i){
        now=s[i];
        if(i==0||now!=old){
            num[now]=1;
            if(i!=0&&num[old]!=0) broken[old]=false;
        }
        else num[now]=(num[now]+1)%n;
        old=now;
    }
    if(num[now]!=0) broken[now]=false;
    
    set<int> ans;
    for(auto i:s){
        if(broken[i]){
            cout<<i;
            ans.insert(i); broken[i]=false;
        }
    }
    cout<<"\n";
    for(size_t i=0;i<s.size();++i){
        cout<<s[i];
        if(ans.count(s[i])!=0) i+=(n-1);
    }
    cout<<"\n";
}

2 PAT 甲级 1113 Integer Set Partition

#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
int num[MAXN];
int main() {
    int n;cin>>n;
    for(int i=0;i<n;++i){
        cin>>num[i];
    }
    sort(num,num+n);
    int ans=0;
    for(int i=0;i<n;++i){
        ans=i<n/2?(ans-num[i]):(ans+num[i]);
    }
    cout<<n%2<<" "<<ans; 
}

3 PAT 甲级 1114 Family Property

#include <bits/stdc++.h>
using namespace std;
const int N=10010;
struct Family{
    int m,ts,ta;
};
unordered_map<int,Family> ans_data;
int estate[N],area[N];
set<int> all_p,ids;
vector<int> ans;

int father[N];
int Find(int x){
    if(father[x]!=x) father[x]=Find(father[x]);
    return father[x];
}
void Union(int a,int b){
    int ra=Find(a),rb=Find(b);
    if(ra<rb) father[rb]=ra;
    else father[ra]=rb;
}
int main() {
    for(int i=0;i<N;++i) father[i]=i;
    int n;cin>>n;
    for(int i=0;i<n;++i){
        int id,fa,ma,k,m,a,chi;
        cin>>id>>fa>>ma>>k;
        all_p.insert(id);
        if(fa!=-1) {Union(id,fa); all_p.insert(fa);}
        if(ma!=-1) {Union(id,ma); all_p.insert(ma);}
        for(int j=0;j<k;++j){
            cin>>chi;
            if(chi!=-1) {Union(id,chi); all_p.insert(chi);}
        }
        cin>>m>>a;
        estate[id]=m,area[id]=a;
    }
    for(auto i:all_p){
        int id=Find(i);
        ans_data[id].m++;
        ans_data[id].ts+=estate[i];
        ans_data[id].ta+=area[i];
        ids.insert(id);
    }
    for(auto i:ids) ans.push_back(i);
    sort(ans.begin(),ans.end(),[](int a,int b){
        int oa=ans_data[a].ta*ans_data[b].m;
        int ob=ans_data[b].ta*ans_data[a].m;
        if(oa!=ob) return oa>ob;
        else return a<b;
    });
    printf("%lu\n",ans.size());
    for(auto i:ans){
        printf("%04d %d %.3lf %.3lf\n",i,ans_data[i].m,
          ans_data[i].ts*1.0/ans_data[i].m,ans_data[i].ta*1.0/ans_data[i].m);
    }
}

4 PAT 甲级 1115 Counting Nodes in a BST

#include <bits/stdc++.h>
using namespace std;
struct Node{
    int val,layer;
    Node *lchild{NULL},*rchild{NULL};
};
void Insert(Node *&root,int val){
    if(root==NULL){
        root=new Node();
        root->val=val;
    }else{
        if(val<=root->val) Insert(root->lchild,val);
        else Insert(root->rchild,val);
    }
}
vector<Node*>nodes;
int max_layer=1;
void BFS(Node *root){
    if(root==NULL) return;
    queue<Node*> q;
    q.push(root);
    root->layer=1;
    while(!q.empty()){
        Node* now=q.front();q.pop();
        nodes.push_back(now);
        if(now->lchild){
            now->lchild->layer=now->layer+1;
            max_layer=max(max_layer,now->layer+1);
            q.push(now->lchild);
        }
        if(now->rchild){
            now->rchild->layer=now->layer+1;
            max_layer=max(max_layer,now->layer+1);
            q.push(now->rchild);
        }
    }
}
int main() {
    int n;cin>>n;
    Node *root=NULL;
    for(int i=1;i<=n;++i){
        int tmp;cin>>tmp;
        Insert(root,tmp);
    }
    BFS(root);
    int c1=0,c2=0;
    for(auto p:nodes){
        if(p->layer==max_layer-1) ++c2;
        if(p->layer==max_layer) ++c1;
    }
    cout<<c1<<" + "<<c2<<" = "<<c1+c2<<"\n";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值