1. 程式人生 > >PAT 天梯賽初賽

PAT 天梯賽初賽

L2-009. 搶紅包

#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-010 搶座位 (並查集)
#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-011 玩轉二叉樹
#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;
}
L2-012 關於堆的判斷
#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;
}