【PAT甲级真题整理一】1001-1030

1001 A+B Format(20)a+b,3个一组用“,”隔开

【题意】

计算A+B,并且3个一组用“,”隔开。

【解题思路】

自己的刚开始比较麻烦,先将计算后的sum存入一个数组中,先将sum的位数与3做模,不整除的位数先输出,再输出后面的数字,但要考虑最后三位的后面不用“,”。

后来看了大佬的题解,发现不用这么复杂,并学习了一个新的函数。但我这里用的是int数组就不用这个函数了。

sprintf(str,"%d",sum); //将num按指定格式输入到str字符串中。

【代码】

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
	int a,b,sum,c[10]={0},d[10]={0},i=0,s;
	cin>>a>>b;
	sum=a+b;
	if(sum==0){
		cout<<"0"<<endl;
		return 0;
	}
	if(sum<0){
		cout<<"-";
		sum=fabs(sum);
	}
	while(sum){
		int x=sum%10;
		c[i]=x;
		sum=sum/10;
		i++;
	}
	int x=i%3,j,y=x;
	for(j=0;j<i;j++)d[j]=c[i-j-1];
	j=0;
	/*
	while(x){        //注释这部分为自己刚开始写的 
		cout<<d[j];
		x--;j++;
		if(x==0 && i-j!=0)cout<<",";
	}
	int k=0;
	for(;j<i;j++){
		cout<<d[j];
		k++;
		if(k==3 && j!=i-1){
			cout<<",";
			k=0;
		}
	}
	cout<<endl;*/
	for(int j=0;j<i;j++){
		cout<<d[j];
		if((i-j-1)%3==0 && j!=i-1)cout<<",";
	}
	cout<<endl;
	return 0;
 } 

1002 A+B for Polynomials(25)多项式相加

【题意】

两个多项式相加。给定每个多项式的系数和指数,求相加后的系数和指数。

【解题思路】

考虑到数据不是很大,直接定义一个数组a,因为多项式的系数一定为整数,所以将数组a的下标作为多项式的系数然后相加即可,输出数组数据不为0的数。

【代码】

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
	int repeat=2,n,max=-1,min=5000;
	double a[2000];
	memset(a,0,sizeof(a));
	while(repeat--){
		cin>>n;
		for(int i=0;i<n;i++){
			int x;double y;
			cin>>x>>y;
			a[x]=a[x]+y;
			if(x>max)max=x;
		}
	}
	int k=0;
	for(int i=0;i<=max+1;i++){
		if(a[i]!=0)k++;
	}
	cout<<k;
	for(int i=max;i>=0;i--){
		if(a[i]!=0)printf(" %d %.1f",i,a[i]);
	}
	cout<<endl;
	return 0;
}

 

1019 General Palindromic Number(20)回文数

【题意】

给定一个数n和b,判断n在b进制下是否是回文数,并输出n在b进制下的数。

【解题思路】

主要在于如何计算n在b进制下的数,其实还是简单滴,但是要注意a[]记录的数据是n在b进制下的数的逆序。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int a[maxn];
int main()
{
    int n,b,k=0;
    memset(a,0,sizeof(a));
    scanf("%d%d",&n,&b);
    while(n)
    {
        int x=n%b;
        a[k++]=x;
        n/=b;
    }
    int flag=1;
    for(int i=0;i<k/2;i++)
    {
        if(a[i]!=a[k-i-1])
        {
            flag=0;
            break;
        }
    }
    if(flag)printf("Yes\n");
    else printf("No\n");
    printf("%d",a[k-1]);
    for(int i=k-2;i>=0;i--)
        printf(" %d",a[i]);
    printf("\n");
    return 0;
}

 

1017 Queueing at Bank (25)模拟

【题意】

模拟银行的作息,银行8:00-17:00营业,8:00之前到的顾客都需要等到8:00才能被服务,17:00以后到的顾客都不能被服务且不计入平均等待时间内,但是只要是17:00及以前到的不管他的服务时间是否超出17:00都能被服务。

【解题思路】

先排序,按来的时间的早晚进行排序,若相同则按服务时间排序,服务时间越短越靠前。然后只要找每个窗口最早的有空时间就好了,当窗口的时间大于顾客来的时间时要累加等待时间,否在则不累加。

另外为了方便都转换为秒来实现,最后输出/60就可以了。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
struct customer
{
    int t,w;
}c[maxn];
bool cmp(customer a,customer b)
{
    return a.t<b.t;
}
int main()
{
    int n,k,hh,mm,ss,a[105],w;
    int t1=8*3600,t2=17*3600,ans=0;
    scanf("%d%d",&n,&k);
    for(int i=0;i<k;i++)
        a[i]=t1;
    int num=n;
    for(int i=0;i<n;i++)
    {
        scanf("%d:%d:%d",&hh,&mm,&ss);
        scanf("%d",&w);
        c[i].t=hh*3600+mm*60+ss;
        c[i].w=w*60;
    }
    sort(c,c+n,cmp);
    for(int i=0;i<n;i++)
    {
        int min1=a[0],p=0;
        if(c[i].t>t2)
        {
            num--;
            continue;
        }
        for(int j=1;j<k;j++)
        {
            if(min1>a[j])
            {
                min1=a[j];
                p=j;
            }
        }
        if(min1>=c[i].t)
        {
            ans+=min1-c[i].t;
            a[p]+=c[i].w;
        }
        else
            a[p]=c[i].t+c[i].w;
        //printf("ans=%d,a[%d]=%d\n",ans,p,a[p]);
    }
    double avg=ans*1.0/(60*num*1.0);
    printf("%.1f\n",avg);
    return 0;
}

 

1023 Have Fun with Numbers(20)大数相加

【题意】

某个数乘以两倍之后看每位数的个数是否与原数相同。比如123456789,num[1]~num[9]均等于1,乘2倍后246913578,num[1]~num[9]也均等于1。

【解题思路】

这题有3个注意点

1.因为n的位数最大为20位,而long long只有19位,并且考虑到乘2倍之后要进位的关系,所以需要用字符串处理。

2.如果进位后,每位数与原来的个数肯定不同,这个要单独拿出来考虑,不然可能存在某个数,乘以2倍后数字中会有0,但其他各位数的个数都与原数相同的情况。

3.注意最后输出的时候不管Yes还是No都要把乘以两倍后的数输出。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=25;
char a[maxn],b[maxn],c[maxn];
int num1[10],num2[10];
int main()
{
    memset(num1,0,sizeof(num1));
    memset(num2,0,sizeof(num2));
    memset(c,0,sizeof(c));
    scanf("%s",a);
    int l=strlen(a);
    for(int i=0;i<l;i++)
        num1[a[i]-'0']++;
    for(int i=0;i<l;i++)
        b[i]=a[l-i-1];
    int t=0,i;
    for(i=0;i<l;i++)
    {
        int x=b[i]-'0'+b[i]-'0'+t;
        t=x/10;
        c[i]=x%10+'0';
    }
    int l2=i,flag=1;
    if(t!=0)
    {
        c[l2++]=t+'0';
        flag=0;
    }
    if(flag)
    {
        for(i=0;i<l2;i++)
            num2[c[i]-'0']++;
        for(i=1;i<=9;i++)
        {
            if(num1[i]!=num2[i])
            {
                flag=0;
            break;
            }
        }
    }
    if(!flag)printf("No\n");
    else printf("Yes\n");
    for(i=l2-1;i>=0;i--)
        printf("%c",c[i]);
    printf("\n");
    return 0;
}

1024 Palindromic Number(25)大数相加

【题意】

给定n和step,判断n是否为回文数,若不是,则将n反转后再加n,看其是不是回文数,若是则输出步数,若不是继续上述操作,当操作步数大于step时输出step。

【解题思路】

数据很大还是需要大数相加,再注意一些细节即可。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=55;
char a[maxn],b[maxn],c[maxn],lc;
int judge()
{
    int l=strlen(a),flag=1;
    for(int i=0;i<l/2;i++)
    {
        if(a[i]!=a[l-i-1])
            return 0;
    }
    if(flag)return 1;
}
void add()
{
    int l=strlen(a),t=0,i;
    for(i=0;i<l;i++)
    {
        int x=a[i]-'0'+b[i]-'0'+t;
        c[i]=x%10+'0';
        t=x/10;
    }
    lc=i;
    if(t!=0)c[lc++]=t+'0';
}
int main()
{
    int m,flag=1,i;
    scanf("%s%d",a,&m);
    for(i=0;i<m;i++)
    {
        lc=0;
        memset(c,0,sizeof(c));
        if(judge())break;
        int l=strlen(a);
        for(int j=0;j<l;j++)
            b[j]=a[l-j-1];
        add();
        for(int j=lc-1,k=0;j>=0;j--,k++)
            a[k]=c[j];
    }
    printf("%s\n%d\n",a,i);
    return 0;
}

1025 PAT Ranking(排序)

【题意】

分成K组,每组N个人,输出每个人在每组的排名,以及其的组别。最后再按字典序顺序输出整体的排名。

【解题思路】

每组数据排个序记录局部排名,再整体排序记录整体排名,注意最后输出时当分数相同时,序号越小越靠前。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=300005;
struct regist
{
    string sno;
    int score;
    int fr,ln,lr;
}r[maxn];
bool cmp(regist a,regist b)
{
    return (a.score==b.score)?a.sno<b.sno:a.score>b.score;
}
int main()
{
    int n,k,t=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&k);
        for(int j=t;j<t+k;j++)
        {
            cin>>r[j].sno>>r[j].score;
            r[j].ln=i;
        }
        sort(r+t,r+t+k,cmp);
        int p=1,q=1;
        r[t].lr=p;
        for(int j=t+1;j<t+k;j++)
        {
            if(r[j-1].score==r[j].score)
            {
                r[j].lr=p;
                q++;
            }
            else
            {
                p+=q;
                r[j].lr=p;
                q=1;
            }
        }
        t+=k;
    }
    sort(r,r+t,cmp);
    int p=1,q=1;
    r[0].fr=p;
    for(int i=1;i<t;i++)
    {
        if(r[i-1].score==r[i].score)
        {
            r[i].fr=p;
            q++;
        }
        else
        {
            p+=q;
            r[i].fr=p;
            q=1;
        }
    }
    printf("%d\n",t);
    for(int i=0;i<t;i++)
    {
        cout<<r[i].sno;
        printf(" %d %d %d\n",r[i].fr,r[i].ln,r[i].lr);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39826163/article/details/81040555
今日推荐