浙大PAT考试1005~1008

突然发现前面的题目不一定是4个成套出现的。

其实看下题目的分数,就知道题目的难度。


20分的肯定是不需要算法的水题,25~30分的可能是简单dp,或简单搜索。

pat的题目主要是把题目得读懂了,感觉很容易出现bug。


题目地址:http://pat.zju.edu.cn/contests/pat-a-practise


1005

题目大意:给你一个字符串,把他们按位加起来,然后用英文输出即可。

AC代码:

//water

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;

char str[105];
int ans[105];

char mp[10][10]={"zero","one","two","three","four","five",
                 "six","seven","eight","nine"};

int main()
{
    int sum,i;
    while(cin>>str)
    {
        sum=0;
        int len=strlen(str);
        for(i=0;i<len;i++)
            sum+=str[i]-'0';

        int t=0;
        if(sum==0)
        {
            puts("zero");
            continue;
        }
        while(sum)
        {
            ans[t++]=sum%10;
            sum/=10;
        }

        cout<<mp[ans[t-1]];
        for(i=t-2;i>=0;i--)
            cout<<" "<<mp[ans[i]];
        cout<<endl;
    }
    return 0;
}

/*
12345
0
*/


1006

题目大意:给你n个人,分别给名字,进来的时间,出去的时间。找出最早进来的人和最晚出去的人。

直接排序就好了。。

AC代码:

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;

struct node
{
    char s1[25];
    char s2[25];
    char s3[25];
}nod[1005];

int cmp1(node p1,node p2)
{
    if(strcmp(p1.s2,p2.s2)<0)
        return 1;
    return 0;
}

int cmp2(node p1,node p2)
{
    if(strcmp(p1.s3,p2.s3)>0)
        return 1;
    return 0;
}

int main()
{
    int n,i;
    while(cin>>n)
    {
        for(i=0;i<n;i++)
            cin>>nod[i].s1>>nod[i].s2>>nod[i].s3;

        sort(nod,nod+n,cmp1);
        cout<<nod[0].s1<<" ";
        sort(nod,nod+n,cmp2);
        cout<<nod[0].s1<<endl;
    }
    return 0;
}

/*
3
CS301111 15:30:28 17:00:10
SC3021234 08:00:00 11:25:25
CS301133 21:45:00 21:58:40
*/


1007

题目大意:找一个最大字串和,还是一维的,不过wa点无数。。

1.这个需要输出的是 首尾元素,不是下标。

2.答案为负数,输出0,第一个元素和最后一个元素。

3.i,j都是最小的,如果不是最小,如有前缀0,需要往前推。


dp方程为dp[i]=max(dp[i-1],0)+a[i];

AC代码:

//一维最大连续子串和。。
//注意这个题目是要输出首尾元素,而不是下标。。
//这题bug真多。。

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=100005;

ll a[maxn],dp[maxn];

ll ma(ll m,ll n)
{
    if(m>n) return m;
    return n;
}

int main()
{
    int n,i;
    while(cin>>n)
    {
        for(i=0;i<n;i++)
            cin>>a[i];

        ll res=-1e9;
        int l,r;
        dp[0]=a[0];
        if(dp[0]>res)
        {
            res=dp[0];
            r=0;
        }

        for(i=1;i<n;i++)
        {
            dp[i]=ma(dp[i-1],0)+a[i];
            if(dp[i]>res)
            {
                res=dp[i];
                r=i;
            }
        }

        l=r;
        ll tmp=res-a[l];
        while(tmp)
        {
            l--;
            tmp-=a[l];
        }

        while(l>=1&&a[l-1]==0)
            l--;

        if(res==0) cout<<"0 0 0"<<endl;
        else if(res<0) cout<<"0"<<" "<<a[0]<<" "<<a[n-1]<<endl;
        else cout<<res<<" "<<a[l]<<" "<<a[r]<<endl;
    }
    return 0;
}

/*
5
-2 3 4 5 1
5
4 -2 1 4 -2
5
-2 -1 -3 -4 -1
10
-10 1 2 3 4 -5 -23 3 7 -21
4
-1 0 0 -1
4
0 1 2 3
4
0 0 0 0
10
0 2 3 4 -11 3 7 -5 -5 -5
10
3 7 -11  1 2 3 4 -5 -5 -5
*/


1008

题目大意:最开始在0层电梯,然后上一层需要6s,下一层需要4s,停一层需要5s,问你总共需要多长时间,直接计算即可。

20分water...


AC代码:

//water

#include<iostream>
#include<cstdio>
using namespace std;

int main()
{
    int n;
    int i,las;
    while(cin>>n)
    {
        int x;
        las=0;
        int res=n*5;
        for(i=0;i<n;i++)
        {
            cin>>x;
            if(las>x)
                res+=(las-x)*4;
            else
                res+=(x-las)*6;
            las=x;
        }

        cout<<res<<endl;
    }
    return 0;
}

//3 2 3 1


你可能感兴趣的:(pat)