PAT 天梯賽初賽
阿新 • • 發佈:2018-11-20
L2-009. 搶紅包
L2-010 搶座位 (並查集)#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<queue> #include<algorithm> using namespace std; int N; struct node{ int id; double money; int cnt; node(){ id=-1; money=0; cnt=0; } }person[10001]; int com(struct node a,struct node b){ if(a.money==b.money){ if(a.cnt==b.cnt){ return a.id<b.id; } return a.cnt>b.cnt; } return a.money>b.money; } int main(){ int id,k; double mon; scanf("%d",&N); for(int i=1;i<=N;i++){ scanf("%d",&k); person[i].id=i; double total=0; for(int j=0;j<k;j++){ scanf("%d%lf",&id,&mon); total+=mon;//若在這裡轉換成分,第一個case錯誤 person[id].money+=mon; person[id].cnt++; } person[i].money-=total; } sort(person+1,person+N+1,com); for(int i=1;i<=N;i++){ printf("%d %.2lf\n",person[i].id,(person[i].money*1.0)/100); } return 0; }
L2-011 玩轉二叉樹#include<cstring> #include<cstdio> #include<iostream> #include<queue> #include<cstdlib> using namespace std; int relation[101][101],N,M,K; int f[101]; int find(int x){ if(x!=f[x]){ f[x]=find(f[x]); } return f[x]; } int main(){ int a,b,c; scanf("%d%d%d",&N,&M,&K); for(int i=0;i<=N;i++){ f[i]=i; } for(int i=0;i<M;i++){ scanf("%d%d%d",&a,&b,&c); if(c==-1){ relation[a][b]=c; relation[b][a]=c; continue; } int x=find(a); int y=find(b); if(x!=y){ f[x]=y;//root不同時並在一起; } } for(int i=0;i<K;i++){ scanf("%d%d",&a,&b); find(a);find(b); if(f[a]==f[b]&&(relation[a][b]!=-1)){ printf("No problem\n"); } else if(f[a]==f[b]&&(relation[a][b]==-1)){ printf("OK but...\n"); } else if(f[a]!=f[b]&&(relation[a][b]!=-1)){ printf("OK\n"); } else{ printf("No way\n"); } } return 0; }
L2-012 關於堆的判斷#include<cstring> #include<cstdio> #include<iostream> #include<queue> #include<cstdlib> using namespace std; int in[31],pre[31]; struct node{ int num; struct node*left; struct node*right; }; typedef struct node*Tree; Tree build(int in_s,int in_e,int pre_s,int pre_e){ if((in_e-in_s)!=(pre_e-pre_s)) return NULL; if(in_s>in_e||(pre_s>pre_e)) return NULL; Tree t=(Tree)malloc(sizeof(struct node)); if(!t) return 0; t->num=pre[pre_s]; t->left=NULL; t->right=NULL; int i; for(i=in_s;i<=in_e;i++){ if(in[i]==pre[pre_s]){ break; } } if(i>in_s){ int ll=i-in_s; if(ll==0) return t; t->left=build(in_s,i-1,pre_s+1,pre_s+ll); } if(i<in_e){ int ll=in_e-i; if(ll==0) return t; t->right=build(i+1,in_e,pre_e-ll+1,pre_e); } return t; } void level(Tree T){ if(T==NULL) return ; queue<Tree>q; q.push(T); Tree t; int flag=0; while(!q.empty()){ t=q.front(); q.pop(); if(!flag){ printf("%d",T->num); flag=1; } else{ printf(" %d",t->num); } if(t->right){ q.push(t->right); } if(t->left){ q.push(t->left); } } return ; } int main(){ int N; Tree T; scanf("%d",&N); for(int i=0;i<N;i++){ scanf("%d",&in[i]); } for(int i=0;i<N;i++){ scanf("%d",&pre[i]); } T=build(0,N-1,0,N-1); level(T); return 0; }
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
int N,M;
int h[1001];
void update(int n){
if(n==1) return ;
int t;
int child=n,parent;
for(;child>1;child=parent){
parent=child/2;
if(h[child]<h[parent]){
t=h[child];
h[child]=h[parent];
h[parent]=t;
}
}
return ;
}
int find(int a,int b,int num){
// cout<<a<<' '<<b<<endl;
int child,x,y;
for(int i=1;i<=N;i++){
if(h[i]==a){
x=i;
}
if(h[i]==b){
y=i;
}
}
// cout<<x<<' '<<y<<' '<<num<<endl;
if(num==1){
if(x/2==y/2&&(x>1&&y!=x)){
return 1;
}
else{
return 0;
}
}
else if(num==2){
if(y/2==x&&(x>0)) return 1;
else return 0;
}
else{
if(x/2==y&&(y>0)) return 1;
else return 0;
}
return 0;
}
int main(){
int tmp;
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++){
scanf("%d",&h[i]);
update(i);
}
// for(int i=1;i<=N;i++){
// cout<<h[i]<<' ';
// }
getchar();
string str[7];
int j;
for(int i=1;i<=M;i++){
for(j=0;;j++){
cin>>str[j];
char ch=getchar();
if(ch=='\n') break;
}
if(j==3){
int tmp;
sscanf(str[0].c_str(),"%d",&tmp);
if(h[1]==tmp){
printf("T\n");
}
else{
printf("F\n");
}
}
else if(j==4){
int tmp1,tmp2;
sscanf(str[0].c_str(),"%d",&tmp1);
sscanf(str[2].c_str(),"%d",&tmp2);
if(find(tmp1,tmp2,1)){
printf("T\n");
}
else{
printf("F\n");
}
}
else if(j==5){
string ss=str[3];
int tmp1,tmp2;
sscanf(str[0].c_str(),"%d",&tmp1);
sscanf(str[5].c_str(),"%d",&tmp2);
if(ss=="parent"){
if(find(tmp1,tmp2,2)){
printf("T\n");
}
else{
printf("F\n");
}
}
else if(ss=="child"){
if(find(tmp1,tmp2,3)){
printf("T\n");
}
else{
printf("F\n");
}
}
}
}
return 0;
}