浙大PAT考试1061~1064(2013-8-30)

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

 

浙大PAT考试1061~1064(2013-8-30)_第1张图片

 

1061:

给四个字符串,前两个串第一个公共的大写字母A~G表示周一到周日,前两个串第二个公共字母0~9,A~N表示时间到0~23(hour)。后两个串的第一个公共英文字符所在的位置数组下标,表示秒。输出即可。

代码:

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

char weekday[8][5]={"MON","TUE","WED","THU","FRI","SAT","SUN"};

int isabc(char x)
{
    if(x>='a'&&x<='z') return 1;
    if(x>='A'&&x<='Z') return 1;
    return 0;
}

int main()
{
    int week,hour,mini;
    int i,j;

    char str1[105],str2[105];
    while(cin>>str1>>str2)
    {
        int len=strlen(str1);
        for(i=0;i<len;i++)
        {
            if(str1[i]==str2[i]&&str1[i]>='A'&&str1[i]<='G')
            {
                week=str1[i]-'A';
                break;
            }
        }

        for(j=i+1;j<len;j++)
        {
            if(str1[j]==str2[j])
            {
                if(str1[j]>='0'&&str1[j]<='9')
                {
                    hour=str1[j]-'0';
                    break;
                }
                else if(str1[j]>='A'&&str1[j]<='N')
                {
                    hour=str1[j]-'A'+10;
                    break;
                }
            }
        }

        cin>>str1>>str2;
        len=strlen(str1);
        for(i=0;i<len;i++)
        {
            if(str1[i]==str2[i]&&isabc(str1[i]))
            {
                mini=i;
                break;
            }
        }

        printf("%s %02d:%02d\n",weekday[week],hour,mini);
    }
    return 0;
}

/*
3485djDkxh4hhGE
2984akDfkkkkggEdsb
s&hgsfdk
d&Hyscvnm
*/


 


 

1062:

一个low值,一个high值

每个人有两个值,

1.如果两个值都大于high,是圣人,最先排序。

2.第一个值大于high的,第二排序。

3.如果第二个值大于第一个值,是小人,应该最后排序。

4.剩下的都第三排序。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
const int maxn = 100005;
using namespace std;

int low,high;

struct node
{
    int g1;
    int g2;
    int total;
    int index;
}nod[maxn];

int getnum(node p1)
{
    if(p1.g1>=high&&p1.g2>=high) return 1;
    if(p1.g2>p1.g1) return 4;
    if(p1.g1>=high) return 2;
    return 3;
}

int cmp(node p1,node p2)
{
    if(getnum(p1)<getnum(p2)) return 1;
    if(getnum(p1)==getnum(p2)&&p1.total>p2.total) return 1;
    if(getnum(p1)==getnum(p2)&&p1.total==p2.total&&p1.g1>p2.g1) return 1;
    if(getnum(p1)==getnum(p2)&&p1.total==p2.total&&p1.g1==p2.g1&&p1.index<p2.index) return 1;
    return 0;
}

int main()
{
    int n;

    int i;
    while(cin>>n>>low>>high)
    {
        int x,y,z;
        int tes=1;
        for(i=1;i<=n;i++)
        {
            cin>>x>>y>>z;
            if(y<low||z<low) continue;
            nod[tes].g1=y,nod[tes].g2=z;
            nod[tes].total=y+z;
            nod[tes++].index=x;
        }
        n=tes;

        cout<<n-1<<endl;
        sort(nod+1,nod+n,cmp);
        for(i=1;i<n;i++)
        {
            printf("%08d %d %d\n",nod[i].index,nod[i].g1,nod[i].g2);
        }
    }
    return 0;
}

/*
14 60 80
10000001 64 90
10000002 90 60
10000011 85 80
10000003 85 80
10000004 80 85
10000005 82 77
10000006 83 76
10000007 90 78
10000008 75 79
10000009 59 90
10000010 88 45
10000012 80 100
10000013 90 99
10000014 66 60
*/


 


 

1063:

给一些集合,求任意两个集合的交集元素个数/并集元素个数。这里的元素里的元素有唯一性,一个元素在一个集合只存在一个。直接用set处理即可。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<set>
#include<algorithm>
const int maxn = 55;
using namespace std;

int n;
set<int> mq[maxn];
set<int>::iterator it,it1,it2;

int main()
{
    int n,i;
    while(cin>>n)
    {
        for(i=1;i<=n;i++)
            mq[i].clear();

        int k,x;
        for(i=1;i<=n;i++)
        {
            cin>>k;
            while(k--)
            {
               cin>>x;
               mq[i].insert(x);
            }
        }

        int q,a,b;
        cin>>q;
        while(q--)
        {
            cin>>a>>b;
            int len1=mq[a].size();
            int len2=mq[b].size();

            //把两个并起来方便一些,交集个数也就出来了-.-
            /*set<int> tmp;     //这样会超时,因为需要新开一个set然后insert会耗时
            for(it=mq[a].begin();it!=mq[a].end();it++)
                tmp.insert(*it);
            for(it=mq[b].begin();it!=mq[b].end();it++)
                tmp.insert(*it);
            int len3=tmp.size();*/

            int len3=0;
            for(it1=mq[a].begin(),it2=mq[b].begin();it1!=mq[a].end()&&it2!=mq[b].end();)
            {
                if(*it1<*it2) it1++;
                else if(*it1>*it2) it2++;
                else {it1++,it2++;}
                len3++;
            }
            while(it1!=mq[a].end())
            {
                it1++;
                len3++;
            }
            while(it2!=mq[b].end())
            {
                it2++;
                len3++;
            }
            double ans1=len1+len2-len3;  //交
            double ans2=len3;      //并
            printf("%.1f%%\n",ans1*100.0/ans2);
        }
    }
    return 0;
}

/*
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
*/


 


 

1064:

本题很看重思想,就是给你一些数,让你用这些数字构成完全二叉排序树。看了别人的博客才恍然大悟。由于是完全二叉树,那么如果父结点下标为i(从1开始计数)。存在左孩子,那么左孩子下标=2*i,如果存在右孩子,那么右孩子下标=2*i+1;并且有排序树的观点,那么用dfs即可,先从左子树标号,然后标记根,然后再标记右子树。(前提是先对所有的数字排个序)

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
const int maxn = 1005;
using namespace std;

int n;
int a[maxn];
int ans[maxn];
int pos;

int cmp(int p1,int p2)
{
    if(p1<p2) return 1;
    return 0;
}

void dfs(int x)
{
    if(x>n) return;
    int l,r;   //分别代表左右孩子
    l=x<<1,r=l+1;
    dfs(l);
    ans[x]=a[pos++];
    dfs(r);
}

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

        sort(a+1,a+n+1,cmp);

        pos=1;
        dfs(1);
        cout<<ans[1];
        for(i=2;i<=n;i++)
            cout<<" "<<ans[i];
        cout<<endl;
    }
    return 0;
}

/*
10
1 2 3 4 5 6 7 8 9 0
*/


 


 


 

 

你可能感兴趣的:(pat)