PAT 字符,数字处理题,总是有坑,边界,特殊,时间复杂度

本文精选了PAT竞赛中的经典算法题目,包括数值计算、字符串处理、数据结构应用等,提供AC代码及注意事项,帮助读者深入理解算法实现细节。

1054 求平均值 (20)

题目地址

https://www.patest.cn/contests/pat-b-practise/1054

注意点

  • 输入输出
  • case4 把 “1.” 当成正确的 (坑)

1052 卖个萌 (20)

题目地址

https://www.patest.cn/contests/pat-b-practise/1052

注意点

  • 输出 \ 时 需要转义 “\”(类似还有 %等等特殊字符)

1048 数字加密(20)

题目地址

https://www.patest.cn/contests/pat-b-practise/1048

注意点

  • 字符串长度不够需要补齐

1051 复数乘法 (15)

题目地址

https://www.patest.cn/contests/pat-b-practise/1051

ac

  • 注意保留小数位两位
 printf("%.2lf",-0.005); // -0.01
 printf("%.2lf",-0.004999); // -0.00
int main()
{
  //freopen("in.txt","r",stdin);
  double R1,P1,R2,P2;
  while(scanf("%lf%lf%lf%lf",&R1,&P1,&R2,&P2) != EOF)
  {
    double a1 = R1 * cos(P1);
    double b1 = R1 * sin(P1);

    double a2 = R2 * cos(P2);
    double b2 = R2 * sin(P2);

    double real = a1 * a2 - b1 * b2;
    double xu = a1 * b2 + a2 * b1;
    if(real < 0 && real > -0.005)
        real = 0;
    if(xu < 0 && xu > -0.005)
        xu = 0;

    double flag = 0.00;
    if(xu >= 0){
        printf("%.2lf+%.2lfi\n",real,xu);
    }else{
        printf("%.2lf%.2lfi\n",real,xu);
    }

  }//  end while;

  return 0;
}

1058 选择题(20)

题目地址

https://www.patest.cn/contests/pat-b-practise/1058

主要是注意输入输出

  • getchar() 吸收空格
  • 可以直接scanf(“\n”); 处理换行符

1049 数列的片段和(20)

题目地址

https://www.patest.cn/contests/pat-b-practise/1049

ac注意

  • 数学题,需要发现规律
  • 采用long long int 防止超过范围
int a, b;
int c = a*b; 有可能超出范围 (c改成long long int 也一样)
应该是

long long int a , b;
long long int c = a * b;

1028 List Sorting (25)

题目地址

https://www.patest.cn/contests/pat-a-practise/1028

ac注意

使用如下的结构体, 用char[] ,int ,不要用string

struct node{
    int id;
    char name[9];
    int score;
};

1071 Speech Patterns (25)

题目地址

https://www.patest.cn/contests/pat-a-practise/1071

ac代码注意

单词只包含 0-9 a-z A-Z
单词 可以是数字和字母开头

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack> 
#include <map> 
#include <set> 
#include <unordered_map>

using namespace std;

const int INF = 0x7fffffff;
const int MIN_INF = - INF -1;
typedef long long int LL;

int n;

bool isAlpha(char c)
{
    if(c >= 'a' && c <= 'z')
        return true;

    if(c >='0' && c <= '9')
        return true;

    return false;
}

int main()
{
    //freopen("in.txt","r",stdin);

    string s;
    getline(cin,s);

    s += " ";
    int len = s.size();

    for(int i=0;i<len;i++)
    {
        if(s[i] >= 'A' && s[i] <= 'Z')
            s[i] = s[i] - 'A' + 'a';
    }

    int maxCnt = -1;
    map<string,int> mp;
    mp.clear();

    string word ="";
    bool isStart = false;
    for(int i=0;i<len;i++)
    {
        if(isStart == false && isAlpha(s[i]))
        {
            if(word != "")
            {
                //cout << word << endl;
                mp[word] ++;
                if(mp[word] > maxCnt)
                {
                    maxCnt = mp[word];
                }
            }
            word.clear();
            word += s[i];
            isStart = true;
        }else if(isStart && isAlpha(s[i])){
            word += s[i];
        }else if(isStart && !isAlpha(s[i])){
            if(word != "")
            {
                //cout << word << endl;
                mp[word] ++;
                if(mp[word] > maxCnt)
                {
                    maxCnt = mp[word];
                }
            }
            word.clear();
            isStart = false;
        }
    }

    map<string,int>::iterator it = mp.begin();
    while(it != mp.end())
    {
        if(it->second == maxCnt)
        {
            cout << it->first << " " <<  maxCnt;
            break;
        }
        ++it;
    }
    printf("\n");
    return 0;
}

1085 Perfect Sequence (25)

题目地址

https://www.patest.cn/contests/pat-a-practise/1085

ac注意特殊情况,尽可能优化时间

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack> 
#include <map> 
#include <set> 
#include <unordered_map>

using namespace std;

const int INF = 0x7fffffff;
const int MIN_INF = - INF -1;
typedef long long int LL;

const int N = 100005;

int n;
LL p;

LL v[N];

int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d%d", &n, &p) != EOF)
    {
        for(int i =0;i<n;i++)
        {
            scanf("%lld",&v[i]);
        }

        sort(v, v+ n);

        if(v[n-1] <= v[0] * p)
        {
            printf("%d\n",n);
            continue;
        }

        int ansLen = 0; // 存储结果

        int index = 0; // 找尽可能最大的结果
        for(int i=0;i<n;i++)
        {
            LL m = v[i];
            int flagj = -1;
            if(n - i < ansLen || index >= n)
                break;

            for(int j = index ;j < n; j++)
            {
                LL M = v[j];
                if(M > m * p){
                    flagj = j;
                    break;
                }
            }
            if(flagj == -1)
                flagj = n;

            int len = flagj - i;
            if(len > ansLen)
                ansLen = len;

            index = flagj;
        }

        printf("%d\n",ansLen);
    }

    return 0;
}

1032 Sharing (25)

题目地址

https://www.patest.cn/contests/pat-a-practise/1032

ac

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack> 
#include <map> 
#include <set> 
#include <unordered_map>

using namespace std;

const int INF = 0x7fffffff;
const int MIN_INF = - INF -1;
typedef long long int LL;

const int N = 100005;

struct data
{
    int no;
    char c;
    int next;
};

data v[N];

int sta1;
int sta2;
int n;


int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d%d%d", &sta1, &sta2, &n) != EOF)  
    {
        int addr;
        char da;
        int nex;

        for(int i=0;i<n;i++)
        {
            scanf("%d %c %d", &addr, &da, &nex);
            v[addr].no = addr;
            v[addr].c = da;
            v[addr].next = nex;
        }

        vector<data> v1;
        vector<data> v2;

        int fa1 = sta1;
        while(fa1 != -1)
        {
            v1.push_back(v[fa1]);
            fa1 = v[fa1].next;
        }

        int fa2 = sta2;
        while(fa2 != -1)
        {
            v2.push_back(v[fa2]);
            fa2 = v[fa2].next;
        }

        int len1 = v1.size();
        int len2 = v2.size();

        int ans = -1;

        int in1 = len1 - 1;
        int in2 = len2 - 1;
        while(in1 >= 0 && in2 >= 0 && v1[in1].c == v2[in2].c && v1[in1].no == v2[in2].no)
        {
            ans = v1[in1].no;
            in1 --;
            in2 --;
        }

        /*if(len1 >= len2)
        {
            for(int i=0;i<len2;i++)
            {
                int in1 = len1- len2 + i;
                int in2 = i;
                if(v1[in1].c == v2[in2].c)
                {
                    ans = v1[in1].no;
                    break;
                }
            }
        }else{
            for(int i=0;i<len1;i++)
            {
                int in2 = len2- len1 + i;
                int in1 = i;
                if(v1[in1].c == v2[in2].c)
                {
                    ans = v1[in1].no;
                    break;
                }
            }
        }*/

        if(ans == -1)
            printf("-1\n");
        else
            printf("%05d\n", ans);
    }
    //printf("\n");
    return 0;
}

1061 Dating (20)

https://www.patest.cn/contests/pat-a-practise/1061

ac代码

#include <cstdio>
#include <memory>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <list>
#include <stack> 
#include <map> 
#include <set> 

using namespace std;

// freopen("in.txt", "r", stdin);
#define INF 0x7fffffff

const int N = 10l;


int main( )
{
    //freopen("in.txt", "r", stdin);

    char s1[61];
    char s2[61];
    char s3[61];
    char s4[61];
    gets(s1);
    gets(s2);
    gets(s3);
    gets(s4);

    int len1 = strlen(s1);
    int len2 = strlen(s2);
    int len3 = strlen(s3);
    int len4 = strlen(s4);

    string days[] = {"MON", "TUE", "WED", "THU", "FRI","SAT", "SUN"};

    string day;
    int hh;
    int mm;

    int i = 0;
    int j = 0;
    int cnt = 0;

    while(i < len1 && j < len2)
    {
        if(s1[i] == s2[j] && s1[i] >= 'A' && s1[i] <= 'G' && cnt == 0)
        {
            day = days[ s1[i] - 'A'];
            cnt = 1;
        }else if(s1[i] == s2[j] &&
            ( (s1[i] >= 'A' && s1[i] <= 'N') || (s1[i] >= '0' && s1[i] <= '9') )
            && cnt == 1)
        {
            if(s1[i] >= 'A' && s1[i] <= 'N')
            {
                hh = 10 + s1[i] - 'A';
            }else{
                hh = s1[i] - '0';
            }
            break;
        }

        i++;
        j ++;
    }

    i = 0;
    j = 0;
    while(i < len3 && j < len4)
    {
        if(s3[i] == s4[j] && 
            ( (s3[i] >= 'A' && s3[i] <= 'Z') || (s3[i] >= 'a' && s3[i] <= 'z') )
            )
        {
            mm = i;
            break;
        }
        i++;
        j++;
    }

    cout << day;
    printf(" %02d:%02d\n", hh,mm);

    return 0;
}

1070. Mooncake (25)

题目地址:https://www.patest.cn/contests/pat-a-practise/1070
注意 double int 相除, 有问题??
ac代码

#include <cstdio>
#include <memory>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <list>
#include <stack> 
#include <map> 
#include <set> 

using namespace std;

// freopen("in.txt", "r", stdin);
#define INF 0x7fffffff

int n, d;

struct pro{
  double amount;
  double tcost;
  double price;
};

bool cmp(pro p1, pro p2)
{
  return p1.price > p2.price;
}

int main()
{
  //freopen("in.txt", "r", stdin);

  while(scanf("%d%d", &n, &d) != EOF)
  {
    vector<pro> v(n);
    for(int i=0;i<n;i++)
    {
      scanf("%lf", &v[i].amount);
    }
    for(int i=0;i<n;i++)
    {
      scanf("%lf", &v[i].tcost);
      v[i].price = v[i].tcost / v[i].amount;
    }

    sort(v.begin(), v.begin() + n, cmp);

    int index =  0;
    int tAountNeed = d;
    double sums = 0.0;
    while(tAountNeed > 0)
    {
      pro tmp = v[index++];

      if(tmp.amount >= tAountNeed)
      {
        sums += tmp.price * tAountNeed;
        break;
      }else{
        tAountNeed -= (int)tmp.amount;

        sums += tmp.tcost;
      }

      if(index >= n)
        break;
    }

    printf("%.2lf\n", sums);
    }

  return 0;
}

1101. Quick Sort (25)

题目地址

https://www.patest.cn/contests/pat-a-practise/1101

ac代码(主要是输出和算法时间效率问题)

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <list>
#include <stack> 
#include <map> 
#include <set> 
#include <iterator> 
#include <unordered_map>

using namespace std;

#define INF 0x7fffffff

typedef long long int LL;

const int N = 100000 + 5;

int n;

int v[N];

int main()
{
    //freopen("in.txt", "r" ,stdin);

    while( scanf("%d", &n) != EOF)
    {
        if(n == 1)
        {
            scanf("%d", &v[0]);
            printf("1\n");
            printf("%d\n", v[0]);
        }else if(n == 2)
        {
            scanf("%d%d", &v[0], &v[1]);
            if(v[0] < v[1])
            {
                printf("2\n");
                printf("%d %d\n", v[0], v[1]);
            }else{
                printf("0\n");
            }
        }else{

            vector<bool> left(n, false);

            scanf("%d", &v[0]);
            int maxLeft = v[0];
            left[0] = true;

            for(int i=1;i<n;i++)
            {
                scanf("%d", &v[i]);
                if(v[i] > maxLeft)
                {
                    left[i] = true;
                    maxLeft = v[i];
                }
            }

            vector<int> ans;

            int minRight = v[n-1];
            /*vector<bool> right(n, false);
            right[n-1] = true;*/
            if(left[n-1])
            {
                ans.push_back(v[n-1]);
            }


            for(int i= n-2;i>=0;i--)
            {
                if(v[i] < minRight)
                {
                    if(left[i])
                        ans.push_back(v[i]);
                    minRight = v[i];
                }
            }

            int len = ans.size();
            printf("%d\n", len);
            if(len > 0)
            {
                sort(ans.begin(), ans.end());

                printf("%d", ans[0]);
                for(int i=1;i<len;i++)
                {
                    printf(" %d", ans[i]);
                }
                //printf("\n");
            }
            printf("\n");
        }
        //printf("\n");
    }
    return 0;
}

1124. Raffle for Weibo Followers (20)

题目地址

https://www.patest.cn/contests/pat-a-practise/1124

ac

有就往下一个
s=2,n=3按照的顺序如下

2 5 8 11

当5位置原来访问过,那么访问序列将变成

2 6 9 12

如果6位置也是访问过的,那么访问序列将变成

2 7 10 13

总之 就是,每两个数据之间的序号一定是相差给定的n的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值