PAT.1035-1045

来源:互联网 发布:软件测试项目管理 编辑:程序博客网 时间:2024/06/05 21:50

早期代码使用 java , 后转c/c++。由于使用java代码的都是比较基础的题目,因此未贴出java代码。


1035. Password (20)


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


解题思路:简单字符串替换。


1036. Boys vs Girls (25)

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

解题思路:分别保存boy和girl的分数最值。


1037. Magic Coupon (25)

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

解题思路:先排序,然后依次正值和正值相乘,负值和负值相乘。

代码如下:
#include <stdio.h>#include <iostream>#include <algorithm>#include <vector>using namespace std;int main(){  int cmp(const void*,const void*);  int n,m;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//  freopen("input.txt","r",stdin);//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  scanf("%d",&n);  int *v1 = new int[n];  for(int i=0;i<n;i++){    scanf("%d",(v1+i));  }  scanf("%d",&m);  int *v2 = new int[m];  for(int i=0;i<m;i++){    scanf("%d",(v2+i));      }    int count = 0;  sort(v1,v1+n);  sort(v2,v2+m);  for(int i=0;i<m&&i<n;++i){    if(v1[i]>0||v2[i]>0)      break;    count += v1[i]*v2[i];  }  for(int i=n-1,j=m-1;i>=0&&j>=0;--i,--j){    if(v1[i]<0||v2[j]<0)      break;    count += v1[i]*v2[j];  }  //  printf("%d:%d:%d:%d\n",v1[0],v1[1],v1[2],v1[3]);  printf("%d\n",count);  return 0;}

1038. Recover the Smallest Number (30)

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

解题思路:对于数A和数B,若AB > BA, 定义 A > B。 可以证明,这种比较规则的有效性:自反性,对称性,传递性。 因此按照定义的规则对数组排序即可。(详见《剑指offer(纪念版)》 面试题33)

代码如下:
#include <stdio.h>#include <iostream>#include <algorithm>#include <cstring>#include <cstring>using namespace std;struct num{  char s[15];}name[10005];bool cmp(const struct num &a,const struct num &b){  char ta[30],tb[30];  strcpy(ta,a.s);  strcpy(tb,b.s);  strcat(ta,b.s);  strcat(tb,a.s);  return strcmp(ta,tb)<0;}int main(){  int n;//  int cmp(const struct num,const struct num);//  freopen("input.txt","r",stdin);  scanf("%d",&n);    for(int i=0;i<n;i++){    scanf("%s",name[i].s);  }  sort(name,name+n,cmp);  bool flag = true;  for(int i=0;i<n;i++){    char* number = name[i].s;        for(int j=0;number[j]!= '\0';j++){            if(flag && number[j]=='0')        continue;      flag = false;      printf("%c",number[j]);    }  }    if(flag){      printf("0\n");    }    return 0;}

1039. Course List for Student (25)

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

解题思路:由于map对字符串处理比较慢,因此根据学生名特点自定义一个映射关系,把学生名映射到数组里。

代码如下:
#include <stdio.h>#include <vector>#include <cstring>#include <algorithm>#define MAXN 26*26*26*10+5using namespace std;/*==================================!!!! cin is slow; map is slow!!!!!!!==================================*/ vector<int> smap[MAXN];int N,K;int hashName(const char* name){  return (name[0] - 'A') * 26 * 26 * 10\    + (name[1] - 'A') * 26 * 10\    + (name[2] - 'A') * 10\    + (name[3] - '0');}int main(){//  freopen("1039.txt","r",stdin);  scanf("%d%d",&N,&K);    for(int i = 0; i < K; i++){    int cid, sn;    scanf("%d%d",&cid,&sn);    for(int j = 0; j < sn; j++){      char name[5];      scanf("%s",name);      smap[hashName(name)].push_back(cid);    }    }  for(int i = 0; i < N; i++){    char name[5];    scanf("%s",name);    int hname = hashName(name);    int msize = smap[hname].size();    sort(smap[hname].begin(),smap[hname].end());    printf("%s %d",name,msize);    for(int i = 0; i < msize; i++){      printf(" %d",smap[hname][i]);    }    printf("\n");  }  return 0;}

1040. Longest Symmetric String (25)


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

解题思路:想不出好办法。暴力找以每一位为中心向两边展开得到的对称字符串的长度。注意字符串长为奇数和偶数的区别。(网上有动态规划的方法)


代码如下:

#include <stdio.h>#include <cstring>#include <algorithm>#define MAXN 1005char mes[MAXN];int len;int maxN;int maxT;int isSym(const char *a, int s){    if(s > len) return 1;    if(s%2 == 0){    for(int i = s/2; (i + s/2)<= len; i++){      int flag = 0;      for(int t = 0; t < s/2; t++)        if(a[i-t-1] != a[i+t]){          flag = 1;          break;        }      if(flag) continue;      return 0;    }  }else{    for(int i = s/2; (i + s/2)< len; i++){      int flag = 0;      for(int t = 1; t <= s/2; t++)        if(a[i-t] != a[i+t]){          flag = 1;          break;        }      if(flag) continue;      return 0;    }  }  return 1;}int main(){//  freopen("1040.txt","r",stdin);  gets(mes);  len = strlen(mes);  int flag = 0;  maxN = 2;  maxT = 1;  while(!flag){    int a = isSym(mes, maxN);    int b = isSym(mes, maxN+1);      if(!a) maxT = maxN;    if(!b) maxT = maxN;    maxN++;     if(a*b) flag = 1;  }  printf("%d",maxT);  return 0;  }

1041. Be Unique (20)

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

解题思路:用数组记录每个数字出现的次数。再对数据依次查询,找出现次数为1的数。

1042. Shuffling Machine (20)

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

结题思路:按照规则交换数组元素即可。

代码如下:
#include <cstdio>#include <cstring>#define MAXN 54int pre[MAXN];int cur[MAXN];int ord[MAXN];int k;int main(){//  freopen("1042.txt","r",stdin);  int flag = 1;  scanf("%d",&k);  for(int i = 0; i < MAXN; i++){ scanf("%d",&ord[i]); pre[i] = i;}  for(int i = 0; i < MAXN; i++){    int index = i;    for(int j = 0; j < k; j++)      index = ord[index] - 1;    cur[index] = pre[i];  }  char c;  int f = 1;  for(int i = 0; i < MAXN; i++){    if(cur[i]/13 == 0) c = 'S';    else if(cur[i]/13 == 1) c = 'H';    else if(cur[i]/13 == 2) c = 'C';    else if(cur[i]/13 == 3) c = 'D';    else c = 'J';    if(f) f = 0;    else printf(" ");    printf("%c%d", c, cur[i]%13+1);  }    return 0;}

1043. Is It a Binary Search Tree (25)

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

解题思路:按照前序遍历构造BST,过程中检查是否为BST。

代码如下:
#include <cstdio>#include <cstring>#include <algorithm>#define MAXN 1005int left[MAXN];int right[MAXN];int val[MAXN];int data[MAXN];int p;int N;int isBST(int s, int t){  int f = s;  int i;  if(s >= t ) return 1;  for(i = s+1; i < t; i++){    if(data[s] <= data[i]) break;  }  f = i;  for(;i < t; i++){    if(data[s] > data[i]) return 0;  }  if(s+1 < f) left[s] = s+1;  if(s < f && f < t) right[s] = f;  return isBST(s+1,f)&&isBST(f,t);}int ismBST(int s, int t){  int f = s;  int i;  if(s >=t ) return 1;  for(i = s+1; i < t; i++){    if(data[s] > data[i]) break;  }  f = i;  for(;i < t; i++){    if(data[s] <= data[i]) return 0;  }  if(s+1 < f) left[s] = s+1;  if(s<f && f < t) right[s] = f;    return ismBST(s+1,f)&&ismBST(f,t);}void showVal(int r){  if(left[r] != -1) showVal(left[r]);  if(right[r] != -1) showVal(right[r]);  if(p) p = 0;  else printf(" ");  printf("%d",data[r]);}int main(){    memset(left,-1,sizeof(left));  memset(right,-1,sizeof(right));  memset(val,0,sizeof(val));  //  freopen("1043.txt","r",stdin);  scanf("%d",&N);  for(int i = 0; i < N; i++) scanf("%d",data+i);  int f1 = isBST(0,N);    int f2 = 0;  if(!f1) f2 = ismBST(0,N);    if(f1 || f2){    printf("YES\n");    p = 1;    showVal(0);  }else printf("NO\n");    return 0;}

1044. Shopping in Mars (25)

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

解题思路:窗口法查找数组连续元素和。

代码如下:
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#define MAXN 100005using namespace std;int data[MAXN];int maxC[MAXN];int des[MAXN];int N;int M;int ma;vector<int> v;int mmax(int i, int j){  if(i > j) return i;  else return j;}int main(){//  freopen("1044.txt","r",stdin);  memset(maxC,0,sizeof(maxC));  scanf("%d%d",&N,&M);  for(int i = 0 ; i < N; i++) scanf("%d",data+i);  ma = 100000010;  int pr = 0;  int mt = 0;  for(int i = 0; i < N; i++){    for(int j = mmax(pr,i); j < N; j++){      mt += data[j];//      printf("%d-%d : %d\n",i+1,j+1,mt);      if(mt >= M){        pr = j;        if(mt < ma){ ma = mt; v.clear(); v.push_back(i);}        else if(mt == ma) v.push_back(i);        des[i] = j;                break;      }    }    if(mt < M) break;    else {      mt -= data[i];      if(pr > i) mt = mt - data[pr];    }  }  for(int i = 0 ; i < v.size(); i++){    printf("%d-%d\n",v[i]+1,des[v[i]]+1);  }  }

1045. Favorite Color Stripe (30)

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

解题思路:求非减最大子数组,动态规划。

代码如下:
#include<cstdio>  #include<iostream>  #include<cstring>  #include<cmath>  #include<string>  #include<vector>  #include<map>  #include<set>  #include<algorithm>  #include<sstream>  using namespace std;  int dp[10005];  int num[205];  int stripe[10005];  int main()  {  //   freopen("1045.txt","r",stdin);    int n,m,k,ans,x;      memset(num,-1,sizeof(num));      scanf("%d",&n);      scanf("%d",&m);      for(int i=1; i<=m; ++i)      {          scanf("%d",&x);          num[x]=i;      }      scanf("%d",&k);      for(int i=1; i<=k; ++i)      {          scanf("%d",&x);          stripe[i]=num[x];      }      for(int i=1; i<=k; ++i)      {          if(stripe[i]>0) dp[i]=1;          else            dp[i]=0;      }      for(int i=2; i<=k; ++i)      {          if(stripe[i]==-1)              dp[i]=0;          else          {              for(int j=1; j<i; ++j)                  if(stripe[i]>=stripe[j])                      dp[i]=max(dp[i],dp[j]+1);          }      }      ans=0;      for(int i=1; i<=k; ++i)          if(dp[i]>ans)              ans=dp[i];      printf("%d\n",ans);      return 0;  }  



解题思路:简单字符串替换。


代码如下:

0 0
原创粉丝点击