PAT.1035-1045

早期代码使用 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+5
using 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 1005

char 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 54

int 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 1005

int 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 100005
using 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值