PAT 1046-1057

来源:互联网 发布:p2c网络金融平台 编辑:程序博客网 时间:2024/06/05 20:14


1046. Shortest Distance(20)

原题地址:http://www.patest.cn/contests/pat-a-practise/1046

解题思路:无他。求距离的题目,最好选一个参考点保存各节点的位置,这样两节点间的距离由位置差即可求得。

代码如下:
#include <cstdio>#include <cstring>#define MAXN 100005int dist[MAXN];int TD;int N, M;int main(){//  freopen("1046.txt","r",stdin);  TD = 0;  memset(dist,0,sizeof(dist));  scanf("%d",&N);  for(int i = 0; i < N; i++) {scanf("%d",dist+i+1); TD += dist[i+1]; dist[i+1] = TD;}    scanf("%d",&M);    for(int i = 0; i < M; i++){    int f, t;    scanf("%d%d",&f,&t);    if(f > t) { int tm = t; t = f; f = tm;}//    int dm = 0;    if(dist[t-1] - dist[f-1] <= TD + dist[f-1] - dist[t-1]) printf("%d\n",dist[t-1] - dist[f-1]);    else printf("%d\n",TD + dist[f-1] - dist[t-1]);//    printf("%d,%d,%d\n",TD,dist[f-1],dist[t-1]);  }  return 0;}

1047. Student List for Course (25)

原题地址:http://www.patest.cn/contests/pat-a-practise/1047

解题思路:用vector保存每门课的学生名单即可。

代码如下:
#include <cstdio>#include <cstring>#include <string>#include <vector>#include <algorithm>#define MAXK 2505using namespace std;vector<string> co[MAXK];int N,K;int main(){//  freopen("1047.txt","r",stdin);  scanf("%d%d",&N,&K);  for(int i = 0; i < N; i++){    char name[8];    int c;    scanf("%s%d",name,&c);    string n(name);    for(int i = 0; i < c; i++){      int t;      scanf("%d",&t);      co[t].push_back(n);    }  }  for(int i = 1; i <= K; i++){    int m = co[i].size();    printf("%d %d\n",i,m);    if(m != 0){      sort(co[i].begin(),co[i].end());      for(int j = 0; j < m; j++) printf("%s\n", co[i][j].c_str());    }  }}

1048. Find Coins (25)

解题思路:开数组记录不同面值银币的个数,再从头往后找符合的组合即可。

原题地址:http://www.patest.cn/contests/pat-a-practise/1048

代码如下:
#include <cstdio>#include <cstring>#define MAXN 1010int cou[MAXN];int N, M;int main(){//  freopen("1048.txt","r",stdin);  memset(cou,0,sizeof(cou));  scanf("%d%d",&N,&M);    for(int i = 0 ; i < N; i++){    int co;    scanf("%d",&co);    cou[co]++;  }      for(int i = 1 ; i <= 500 ; i++){    if( i*2 < M && cou[i] > 0 && cou[M-i] >0){      printf("%d %d",i,M-i);      return 0;    }else if( i*2 == M && cou[i] > 1){      printf("%d %d", i, i);      return 0;    }  }    printf("No Solution");  return 0;}

1049. Counting Ones (30)

原题地址:http://www.patest.cn/contests/pat-a-practise/1049

解题思路:我的思路比较蠢,将数字切分成整十整百整千部分考虑,比较繁琐。
注:(网上有好的方法,即考虑每一位上1出现的个数,找出规律,过程简洁明了。具体可参考:http://blog.csdn.net/tiantangrenjian/article/details/19908885)

代码如下:
#include <cstdio>#include <cmath>int N;int cou;int generate(int m){  int co = 0;  for(int i = 0; i < m; i++){     co = pow(10,i) + 10*co;  }//  printf("%d,return gene: %d\n",m,co);    return co;}int count(int n){//  printf("n:%d\n",n);  int m = 0;  int tmp = n;  int co = 0;  for(; m <= 9 ;m++){    if(tmp/10 == 0) break;    tmp /= 10;  }  //  printf("tmp:%d\n",tmp);    if(tmp > 1) co += ( pow(10,m) +  count(n - tmp*pow(10,m)) + (tmp) * generate(m));  else if(tmp == 1)  co += (n - tmp*pow(10,m) + 1 + count(n - tmp*pow(10,m)) + generate(m));    //    printf("count %d: %d\n", n, co);    return co;}int main(){    scanf("%d",&N);    cou = count(N);    printf("%d\n",cou);    return 0;}

1050. String Subtraction (20)


原题地址:http://www.patest.cn/contests/pat-a-practise/1050

解题思路:记录s2中每个字符出现与否。我的坑点在于,一开始将strlen()函数写进循环判断,导致超时。

代码如下:
#include <cstdio>#include <cstring>#define MAXN 10010char data[MAXN];char ab[MAXN];int flag[100];int main(){//  freopen("1050.txt","r",stdin);  gets(data);  memset(flag,0,sizeof(flag));  gets(ab);//  int cou = 0;  int l = strlen(ab);  for(int i = 0; i < l; i++){    int id = ab[i] - ' ';//    if(flag[id] == 0) cou++;    flag[id] = 1;  }  //  printf("%s",data);  l = strlen(data);   for(int i = 0; i < l; i++){    char c = data[i];    if(!flag[c-' ']) printf("%c",c);  }  return 0;}

1051. Pop Sequence (25)

原题地址:http://www.patest.cn/contests/pat-a-practise/1051

解题思路:用stack保存过渡栈内容。。

代码如下:
#include <cstdio>#include <algorithm>#include <stack>#define MAXN 1005using namespace std;stack<int> st;int sq[MAXN];int M, N, K;void clear(){  while(!st.empty()) st.pop();  }int isPop(){  int co = 0;  clear();  for(int i = 0; i < N; i++){    if(st.size() < M && i+1 == sq[co]){      co++;//      printf("sq[%d]:%d\n",co,sq[co]);      //      if(!st.empty()) printf("st:%d\n",st.top());          while(!st.empty() && st.top() == sq[co]){        co++;        st.pop();      }    }else if(st.size() < M) st.push(i+1);    else return 0;    }  if(st.empty())    return 1;  else return 0;    }int main(){//  freopen("1051.txt","r",stdin);  scanf("%d%d%d",&M,&N,&K);  for(int i = 0; i < K; i++){    for(int j = 0; j < N; j++){      scanf("%d",sq+j);    }        if(isPop()) printf("YES\n");    else printf("NO\n");    }  }

1052. Linked List Sorting (25)

原题地址:http://www.patest.cn/contests/pat-a-practise/1052

解题思路:读入链表元素,进行排序。注意节点的指向下一地址。

代码如下:
#include <cstdio>#include <cstring>#include <vector>#include <algorithm>#define MAXN 100005using namespace std;typedef struct{  int add;  int val;  int nest;}node;vector<node> vn;node n[MAXN];int val[MAXN];int nest[MAXN];int N, sadd;int cmp(const node n1, const node n2){  return n1.val < n2.val;}int main(){//  freopen("1052.txt","r",stdin);    memset(nest,-1,sizeof(nest));  scanf("%d%d",&N,&sadd);    for(int i = 0; i < N; i++){    int s,v,t;    scanf("%d%d%d",&s,&v,&t);    nest[s] = t;    val[s] = v;    }  int s = sadd;  int cou = 0;  while(s!=-1){    n[s].add = s;    n[s].val = val[s];    n[s].nest = nest[s];    vn.push_back(n[s]);    s = nest[s];    cou++;  }    sort(vn.begin(),vn.end(),cmp);      if(cou > 0)    printf("%d %.5d\n", cou,vn[0].add);    else     printf("0 -1");    for(int i = 0; i < cou-1; i++){    printf("%.5d %d %.5d\n", vn[i].add, vn[i].val, vn[i+1].add);  }  if(cou > 0)    printf("%.5d %d %d\n", vn[cou-1].add, vn[cou-1].val, -1);  return 0;}

1053. Path of Equal Weight (30)

原题地址:http://www.patest.cn/contests/pat-a-practise/1053

解题思路:dfs+回溯即可。

代码如下:
#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;#define MAXN 105int chd[MAXN][MAXN];int val[MAXN];int isFa[MAXN];vector<vector<int> > route;vector<int> ro;int N, M, S;int curm;int cmp(const vector<int> v1, const vector<int> v2){  int m = v1.size();  if(m > v2.size()) m = v2.size();  for(int i = 0; i < m; i++){    if(v1[i] == v2[i]) continue;    else return v1[i] > v2[i];    }    return 0;}int find(int root){  ro.push_back(val[root]);  curm += val[root];  if(curm == S && !isFa[root]){     vector<int> v;    v.assign(ro.begin(),ro.end());    route.push_back(v);  }else  if(curm < S){    for(int i = 0; i < N; i++){      if(chd[root][i])        find(i);    }    }  ro.pop_back();  curm -= val[root];    return 0;}int main(){//  freopen("1053.txt","r",stdin);    memset(chd,0,sizeof(chd));  memset(val,0,sizeof(val));  memset(isFa,0,sizeof(isFa));  scanf("%d%d%d",&N, &M, &S);  for(int i = 0; i < N; i++) scanf("%d",val+i);  for(int i = 0; i < M; i++){    int id,num;    scanf("%d%d",&id,&num);    isFa[id] = 1;    for(int j = 0; j < num; j++){      int c;      scanf("%d",&c);      chd[id][c] = 1;    }  }  int root = 0;    curm = 0;  find(root);  sort(route.begin(),route.end(),cmp);  for(int i = 0; i < route.size(); i++){    vector<int> v = route[i];    int flag = 1;    for(int j = 0; j < v.size(); j++){      if(flag) flag = 0;      else printf(" ");      printf("%d", v[j]);    }    printf("\n");    }}

1054. The Dominant Color (20)

原题地址:http://www.patest.cn/contests/pat-a-practise/1054

解题思路:直接遍历找出现最多的元素也能ac。
(注:说一下巧妙的解法: 首先用num 和 count 分别来保存出现最多的数和次数。每次读入一个数,若 count 等于0,则将num赋值读入的数,count ++; 否则,若读入的数与num相等,count++,若读入的数与num 不同,则count--; 这样最后保存的额num一定是出现次数大于一半的那个数。)

代码如下:
#include <cstdio>#include <cstring>#include <algorithm>#define MAXN 805*605using namespace std;int data[MAXN];int M,N;int main(){//  freopen("1054.txt","r",stdin);  scanf("%d%d",&M,&N);  for(int i = 0; i < M*N; i++) scanf("%d",data+i);    sort(data,data+M*N);    printf("%d\n",data[M*N/2]);}

1055. The World's Richest (25)

原题地址:http://www.patest.cn/contests/pat-a-practise/1055

解题思路:用stl中的sort即可。

代码如下:
#include <cstdio>#include <algorithm>#include <cstring>#define MAXN 100005using namespace std;typedef struct{  char name[10];  int age;  int worth;}person;person p[MAXN];int N,K;int cmpN(const char* a, const char *b){  int lena = strlen(a);    int lenb = strlen(b);  for(int i = 0; i < lena && i < lenb; i++){    if(a[i] == b[i]) continue;    else return a[i] < b[i];    }    return lena > lenb;}int cmp(const person p1, const person p2){  if(p1.worth == p2.worth){    if(p1.age == p2.age) return cmpN(p1.name, p2.name);    else return p1.age < p2.age;    }  else return p1.worth > p2.worth;}int main(){//  freopen("1055.txt","r",stdin);  scanf("%d%d",&N,&K);  for(int i = 0; i < N; i++){    scanf("%s%d%d",p[i].name,&p[i].age,&p[i].worth);  }    sort(p,p+N,cmp);    for(int i = 0; i < K; i++){    printf("Case #%d:\n", i+1);    int m,f,t;    scanf("%d%d%d",&m,&f,&t);    int flag = 1;     int index = 0;    while(m>0 && index < N){      if(p[index].age >= f && p[index].age <= t){        m--;        printf("%s %d %d\n", p[index].name, p[index].age, p[index].worth);        flag = 0;      }      index++;      }    if(flag) printf("None\n");    }}

1056. Mice and Rice (25)

原题地址:http://www.patest.cn/contests/pat-a-practise/1056

解题思路:下一回合晋级人数+1即为当前排名。

代码如下:
#include <cstdio>#include <queue>#include <cstring>#define MAXN 1005using namespace std;queue<int> q1;queue<int> q2;int data[MAXN];int order[MAXN];int rak[MAXN];int Np,Ng;int main(){  //  freopen("1056.txt","r",stdin);    scanf("%d%d",&Np,&Ng);  memset(rak,0,sizeof(rak));    for(int i = 0; i< Np; i++) scanf("%d",data+i);  for(int i = 0; i< Np; i++) {scanf("%d",order+i); q1.push(order[i]);}       int flag = 1;  //  printf("%d:%d\n",Np,Ng);  while(!q1.empty() || !q2.empty()){     if(flag){       int a[Ng];       int mx = -1;       int indx = -1;       int co = 0;       int si = q1.size();       int rk = si/Ng + (si%Ng > 0) + 1;       if(si == 1){         rak[q1.front()] = 1;         break;         }          for(int i = 0; i < si; i++){         co++;         a[co-1] = q1.front();         rak[a[co-1]] = rk;                  q1.pop();                  if(mx < data[a[co-1]]) { mx = data[a[co-1]]; indx = a[co-1];}                  if( co == Ng ){           co = 0;           q2.push(indx);           indx = -1;           mx = -1;         }         }       for(int i = 0; i < co; i++){         rak[a[i]] = rk;         if(mx < data[a[i]]) { mx = data[a[i]]; indx = a[i];}           }       if(indx > -1) q2.push(indx);       flag = 0;     }else{       int a[Ng];       int mx = -1;       int indx = -1;       int co = 0;       int si = q2.size();       int rk = si/Ng + (si%Ng > 0) + 1;       if(si == 1){         rak[q2.front()] = 1;         break;         }       for(int i = 0; i < si; i++){         co++;         a[co-1] = q2.front();         rak[a[co-1]] = rk;                  q2.pop();                  if(mx < data[a[co-1]]) { mx = data[a[co-1]]; indx = a[co-1];}                  if( co == Ng ){           co = 0;           q1.push(indx);           indx = -1;           mx = -1;         }         }       for(int i = 0; i < co; i++){         if(mx < data[a[i]]) { mx = data[a[i]]; indx = a[i];}           rak[a[i]] = rk;         }       if(indx > -1) q1.push(indx);       flag = 1;     }   }  int fg = 1;    for(int i = 0; i < Np; i++){    if(fg) fg = 0;    else printf(" ");    printf("%d", rak[i]);    }    return 0;}

1057. Stack (30)

原题地址:http://www.patest.cn/contests/pat-a-practise/1057

解题思路:用树状数组来找中值。 (加上二分查找会更快。)

代码如下:
#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#define MAXN 100005using namespace std;int st[MAXN];int mdt[MAXN];int sz;int N;int getSum(int i){  int s = 0;  while(i > 0){    s += mdt[i];    i -= i&(-i);  }  return s;  }int query(int l, int h){  if(l == h) return l;  int m = (l+h)/2;  if(getSum(m) < (sz+1)/2) return query(m+1,h);  else return query(l,m);}void update(int i, int value){  while(i < MAXN){    mdt[i] += value;    i += i&(-i);  }  }void doPop(){  if(sz == 0) printf("Invalid\n");  else{    printf("%d\n",st[sz-1]);    update(st[sz-1],-1);    sz--;  }}void doPeek(){  if(sz == 0) printf("Invalid\n");  else{    printf("%d\n",query(1,MAXN-1));  }}void doPush(int n){  st[sz] = n;  update(n,1);  sz++;}  int main(){//  freopen("1057.txt","r",stdin);    sz = 0;  memset(mdt,0,sizeof(mdt));  scanf("%d",&N);    for(int i = 0; i < N; i++){    char s[15];    scanf("%s",s);    if(s[1] == 'o') doPop();    else if(s[1] == 'e') doPeek();    else{      int n;      scanf("%d",&n);      doPush(n);      }  }  return 0  }



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿摔跤头着地怎么办 儿童摔倒头着地怎么办 芭蕾舞互相硬了怎么办 微信地图错误怎么办 cs1.6地图变小怎么办 ipad开机卡住了怎么办 iphone锁机了怎么办 厕所到了香水冲不掉怎么办 三星手机玩游戏卡怎么办 手表屏幕有水怎么办 手表内部有水气怎么办 手表里有水雾怎么办 夏天学校太热怎么办 夏天车间太热怎么办 封印者加载不了怎么办 雪铁龙凯旋后备箱打不开怎么办 迅雷9无法加速怎么办 小孩不会拍球怎么办 巨细胞亲和力低怎么办 职工监事离职了怎么办 高考怎么加分怎么办了 荣耀战魂崩溃怎么办 鲅鱼圈二手房房产证怎么办 画面留白太多怎么办 摔倒脖子扭了怎么办 面试问特长没有怎么办 组织一个演讲 你怎么办 跑步把腿跑粗了怎么办 跑步跑出肌肉腿怎么办 班级聚会人不齐怎么办 如果我们分手了怎么办 幼儿园课上完了怎么办 第一次上台唱歌紧张怎么办 第一次当主持人紧张怎么办 主持的时候口吃怎么办 打官司公司改规章制度怎么办 怎么办生日派对比较好 考不过科目一怎么办 卫校毕业证丢了怎么办 不小心摔跤了怎么办 篮球打气口漏气怎么办