PAT乙级(Basic Level)真题

A+B和C (15)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
给定区间[-2的31次方, 2的31次方]内的3个整数A、B和C,请判断A+B是否大于C。

输入描述:
输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。


输出描述:
对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。

输入例子:
4

1 2 3

2 3 4

2147483647 0 2147483646

0 -2147483648 -2147483647

输出例子:
Case #1: false

Case #2: true

Case #3: true

Case #4: false
#include <iostream>
using namespace std;
int main()
{
    int t;
    cin>>t;
    int a,b,c;
    int cas=1;
    while(t--)
    {
        cin>>a>>b>>c;
        if(a>c-b)
            cout<<"Case #"<<cas++<<": true"<<endl;
        else
            cout<<"Case #"<<cas++<<": false"<<endl;
    }
}

数字分类 (20)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:



A1 = 能被5整除的数字中所有偶数的和;

A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;

A3 = 被5除后余2的数字的个数;

A4 = 被5除后余3的数字的平均数,精确到小数点后1位;

A5 = 被5除后余4的数字中最大数字。

输入描述:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的正整数。数字间以空格分隔。


输出描述:
对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。

若其中某一类数字不存在,则在相应位置输出“N”。

输入例子:
13 1 2 3 4 5 6 7 8 9 10 20 16 18

输出例子:
30 11 2 9.7 9
#include <iostream>
#include <stdio.h>
using namespace std;
const int N=1005;
int main()
{
    int n,x;
    scanf("%d",&n);
    int ans1=0,ans2=0,ans3=0,ans5=-1;
    double ans4=0;
    int flag=0,cnt=0;
    int f1=0,f2=0,f3=0,f4=0,f5=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&x);
        if(x%5==0&&x%2==0)
        {
            f1=1;
            ans1+=x;
        }
        if(x%5==1)
        {
            f2=1;
            if(flag&1)
            {
                ans2-=x;
                flag++;
            }
            else
            {
                ans2+=x;
                flag++;
            }
        }
        if(x%5==2)
        {
            f3=1;
            ans3++;
        }
        if(x%5==3)
        {
            f4=1;
            cnt++;
            ans4+=x;
        }
        if(x%5==4)
        {
            f5=1;
            if(x>ans5)
                ans5=x;
        }
    }
    if(f1)
        printf("%d",ans1);
    else
        printf("N");
    if(f2)
        printf(" %d",ans2);
    else
        printf(" N");
    if(f3)
        printf(" %d",ans3);
    else
        printf(" N");
    if(f4)
        printf(" %0.1f",ans4/cnt);
    else
        printf(" N");
    if(f5)
        printf(" %d\n",ans5);
    else
        printf(" N\n");
    return 0;
}

数素数 (20)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。

输入描述:
输入在一行中给出M和N,其间以空格分隔。


输出描述:
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。

输入例子:
5 27

输出例子:
11 13 17 19 23 29 31 37 41 43

47 53 59 61 67 71 73 79 83 89

97 101 103
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
const int N=10005;
int prime[N];
 
void init()
{
    prime[1]=2;
    int f=0,cnt=1;
    for(int i=3;cnt<N;i++)
    {
        f=0;
        for(int j=2;j*j<=i;j++)
        {
            if(i%j==0)
            {
                f=1;
                break;
            }
        }
        if(!f)
            prime[++cnt]=i;
    }
}
int main()
{
    int n,m,x,t=0;
    init();
    scanf("%d%d",&n,&m);
    for(int i=n;i<=m;i++)
    {
        if((i-n)%10==0)
            printf("%d",prime[i]);
        else
        {
            printf(" %d",prime[i]);
            if((i-n)%10==9)
            {
                printf("\n");
                t++;
            }
        }
    }
    if((m-n)%10==0)
        x=(m-n)/10;
    else
        x=(m-n)/10+1;
    if(t!=x)
        printf("\n");
    return 0;
}

福尔摩斯的约会 (20)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很

快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是

第4个字母'D',代表星期四;第2对相同的字符是'E',那是第5个英文字母,代表一天里的第14个钟头(于是一天的0点到23点由数字0到9、

以及大写字母A到N表示);后面两字符串第1对相同的英文字母's'出现在第4个位置(从0开始计数)上,代表第4分钟。现给定两对字符串,

请帮助福尔摩斯解码得到约会的时间。

输入描述:
输入在4行中分别给出4个非空、不包含空格、且长度不超过60的字符串。


输出描述:
在一行中输出约会的时间,格式为“DAY HH:MM”,其中“DAY”是某星期的3字符缩写,即MON表示星期一,TUE表示星期二,WED表示星期三,THU表示星期

四,FRI表示星期五,SAT表示星期六,SUN表示星期日。题目输入保证每个测试存在唯一解。

输入例子:
3485djDkxh4hhGE

2984akDfkkkkggEdsb

s&hgsfdk

d&Hyscvnm

输出例子:
THU 14:04
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
using namespace std;
map<char,int> m;
map<char,string> d;
void init()
{
    m['0']=0;m['1']=1;m['2']=2;m['3']=3;
    m['4']=4;m['5']=5;m['6']=6;m['7']=7;
    m['8']=8;m['9']=9;m['A']=10;m['B']=11;
    m['C']=12;m['D']=13;m['E']=14;m['F']=15;
    m['G']=16;m['H']=17;m['I']=18;m['J']=19;
    m['K']=20;m['L']=21;m['M']=22;m['N']=23;
    d['A']="MON";
    d['B']="TUE";
    d['C']="WED";
    d['D']="THU";
    d['E']="FRI";
    d['F']="SAT";
    d['G']="SUN";
}
int main()
{
    init();
    string s1,s2,s3,s4;
    cin>>s1>>s2>>s3>>s4;
    int len1=s1.size()<s2.size()?s1.size():s2.size();
    int len2=s3.size()<s4.size()?s3.size():s4.size();
    int f1=0;
    for(int i=0;i<len1;i++)
    {
        if(s1[i]==s2[i]&&f1==0&&isupper(s1[i]))
        {
            cout<<d[s1[i]]<<" ";
            f1++;
        }
        else if(s1[i]==s2[i]&&f1==1)
        {
            printf("%02d:",m[s1[i]]);
            break;
        }
    }
    for(int i=0;i<len2;i++)
    {
        if(s3[i]==s4[i]&&isalpha(s3[i]))
        {
            printf("%02d\n",i);
            break;
        }
    }
    return 0;
}

德才论 (25)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之

小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”



现给出一批考生的德才分数,请根据司马光的理论给出录取排名。

输入描述:
输入第1行给出3个正整数,分别为:N(<=105),即考生总数;L(>=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格

被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到

但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于H,但是德分不低于才分的考生属于“才德兼

亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线L的考生也按总分排序,但排在第三类考生之后。


随后N行,每行给出一位考生的信息,包括:准考证号、德分、才分,其中准考证号为8位整数,德才分为区间[0, 100]内的整数。数字间以空格分隔。


输出描述:
输出第1行首先给出达到最低分数线的考生人数M,随后M行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人

总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。

输入例子:
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

输出例子:
12

10000013 90 99

10000012 80 100

10000003 85 80

10000011 85 80

10000004 80 85

10000007 90 78

10000006 83 76

10000005 82 77

10000002 90 60

10000014 66 60

10000008 75 79

10000001 64 90
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
const int N=100005;
struct Node
{
    int sno;
    int d;
    int c;
}s1[N],s2[N],s3[N],s4[N];
bool cmp(Node n1,Node n2)
{
    if(n1.c+n1.d!=n2.c+n2.d)
        return n1.c+n1.d>n2.c+n2.d;
    else
    {
        if(n1.d!=n2.d)
            return n1.d>n2.d;
        else
        {
            return n1.sno<n2.sno;
        }
    }
}
int main()
{
    int n,h,l;
    scanf("%d%d%d",&n,&l,&h);
    int sno;
    int d,c,cnt=0,j=0,k=0,t=0,p=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d%d%d",&sno,&d,&c);
        if(d<l||c<l)
            continue;
        cnt++;
        if(d>=h&&c>=h)
        {
            s1[j].d=d;
            s1[j].c=c;
            s1[j].sno=sno;
            j++;
        }
        else if(d>=h&&c<h)
        {
            s2[k].d=d;
            s2[k].c=c;
            s2[k].sno=sno;
            k++;
        }
        else if(d<h&&c<h&&d>=c)
        {
            s3[t].d=d;
            s3[t].c=c;
            s3[t].sno=sno;
            t++;
        }
        else
        {
            s4[p].d=d;
            s4[p].c=c;
            s4[p].sno=sno;
            p++;
        }
    }
    sort(s1,s1+j,cmp);
    sort(s2,s2+k,cmp);
    sort(s3,s3+t,cmp);
    sort(s4,s4+p,cmp);
    cout<<j+k+t+p<<endl;
    for(int i=0;i<j;i++)
        cout<<s1[i].sno<<" "<<s1[i].d<<" "<<s1[i].c<<endl;
    for(int i=0;i<k;i++)
        cout<<s2[i].sno<<" "<<s2[i].d<<" "<<s2[i].c<<endl;
    for(int i=0;i<t;i++)
        cout<<s3[i].sno<<" "<<s3[i].d<<" "<<s3[i].c<<endl;
    for(int i=0;i<p;i++)
        cout<<s4[i].sno<<" "<<s4[i].d<<" "<<s4[i].c<<endl;
    return 0;

部分A+B (15)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。

现给定A、DA、B、DB,请编写程序计算PA + PB。

输入描述:
输入在一行中依次给出A、DA、B、DB,中间以空格分隔,其中0 < A, B < 1010。


输出描述:
在一行中输出PA + PB的值。

输入例子:
3862767 6 13530293 3

输出例子:
399
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
 
int main()
{
    char a[15],b[15];
    long long ans1=0,ans2=0;
    int da,db;
    cin>>a>>da>>b>>db;
    int lena=strlen(a);
    int lenb=strlen(b);
    for(int i=0;i<lena;i++)
    {
        if(a[i]-'0'==da)
            ans1=ans1*10+da;
    }
    for(int i=0;i<lenb;i++)
        if(b[i]-'0'==db)
            ans2=ans2*10+db;
    cout<<ans1+ans2<<endl;
    return 0;
}

A除以B (20)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

输入描述:
输入在1行中依次给出A和B,中间以1空格分隔。


输出描述:
在1行中依次输出Q和R,中间以1空格分隔。

输入例子:
123456789050987654321 7

输出例子:
17636684150141093474 3
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
    string A,Q;
    int B,R=0;
    cin>>A>>B;
    int length = A.length();
    int temp = A[0]-'0';
    if(temp>=B)
        Q.push_back(temp/B+'0');
    for(int i =1;i<length;i++)
    {
        R = temp%B;
        temp = R*10+ A[i]-'0';
        Q.push_back(temp/B+'0');
    }
    R = temp%B;
    if(length ==1 && A[0]-'0'<B)
        cout<<"0 "<<A[0]-'0';
    else
        cout<<Q<<" "<<R;
 
     
    return 0;
}

锤子剪刀布 (20)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
大家应该都会玩“锤子剪刀布”的游戏:

现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入描述:
输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代

表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。


输出描述:
输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯

一,则输出按字母序最小的解。

输入例子:
10

C J

J B

C B

B B

B C

C C

C B

J B

B C

J J

输出例子:
5 3 2

2 3 5

B B
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
 
int main()
{
    int n;
    char s[10];
    char a,b;
    scanf("%d",&n);
    getchar();
    int cnta=0,cntb=0,cnt=0,cntaC=0,cntaJ=0,cntaB=0,cntbC=0,cntbJ=0,cntbB=0;
    for(int i=0;i<n;i++)
    {
        gets(s);
        a=s[0];
        b=s[2];
        if(a=='C')
        {
            if(b=='C')
            {
                cnt++;
            }
            else if(b=='J')
            {
                cnta++;
                cntaC++;
            }
            else
            {
                cntb++;
                cntbB++;
            }
        }
        else if(a=='J')
        {
            if(b=='C')
            {
                cntb++;
                cntbC++;
            }
            else if(b=='J')
            {
                cnt++;
            }
            else
            {
                cnta++;
                cntaJ++;
            }
        }
        else
        {
            if(b=='C')
            {
                cnta++;
                cntaB++;
            }
            else if(b=='J')
            {
                cntb++;
                cntbJ++;
            }
            else
            {
                cnt++;
            }
        }
    }
    cout<<cnta<<" "<<cnt<<" "<<n-cnta-cnt<<endl;
    cout<<cntb<<" "<<cnt<<" "<<n-cntb-cnt<<endl;
    int ansa=max(cntaB,cntaC);
    ansa=max(ansa,cntaJ);
    if(ansa==cntaB)
        cout<<"B ";
    else if(ansa==cntaC)
        cout<<"C ";
    else
        cout<<"J ";
    int ansb=max(cntbB,cntbC);
    ansb=max(ansb,cntbJ);
    if(ansb==cntbB)
        cout<<"B";
    else if(ansb==cntbC)
        cout<<"C";
    else
        cout<<"J";
    cout<<endl;
    return 0;
}

1019. 数字黑洞 (20)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到
一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。

例如,我们从6767开始,将得到

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...

现给定任意4位正整数,请编写程序演示到达黑洞的过程。

输入描述:
输入给出一个(0, 10000)区间内的正整数N。


输出描述:
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例,每行中间没有空行。注意每个数字按4位数格
式输出。

输入例子:
6767

输出例子:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
int a[5];
int add(int x)
{
    int y=x;
    int i=0;
    while(y)
    {
        a[i++]=y%10;
        y/=10;
    }
    sort(a,a+4);
    int maxn=a[3]*1000+a[2]*100+a[1]*10+a[0];
    int minn=a[0]*1000+a[1]*100+a[2]*10+a[3];
    printf("%04d - %04d = %04d\n",maxn,minn,maxn-minn);
    return (maxn-minn);
}
int main()
{
    int x;
    scanf("%d",&x);
    int y=x;
    int i=0;
    while(y)
    {
        a[i++]=y%10;
        y/=10;
    }
    if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3])
    {
        printf("%04d - %04d = 0000\n",x,x);
        return 0;
    }
    do
    {
        x=add(x);
    }while(x!=6174);
    return 0;
}

月饼 (25)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需

求量,请你计算可以获得的最大收益是多少。



注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、

72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得

72 + 45/2 = 94.5(亿元)。

输入描述:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数

D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿

元为单位)。数字间以空格分隔。


输出描述:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。

输入例子:
3 20

18 15 10

75 72 45

输出例子:
94.50
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
const int N=1005;
struct Node
{
    int w,v;
    double uv;
}a[N];
bool cmp(Node x,Node y)
{
    return x.uv>y.uv;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i].w);
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i].v);
        a[i].uv=1.0*a[i].v/a[i].w;
    }
    double max_v=0;
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++)
    {
        if(a[i].w>m)
        {
            max_v+=m*a[i].uv;
            m=0;
        }
        else
        {
            max_v+=a[i].v;
            m-=a[i].w;
        }
    }
    printf("%0.2f\n",max_v);
    return 0;
}

个位数统计 (15)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定N = 100311,则有2个0,3个1,和1个3。

输入描述:
每个输入包含1个测试用例,即一个不超过1000位的正整数N。


输出描述:
对N中每一种不同的个位数字,以D:M的格式在一行中输出该位数字D及其在N中出现的次数M。要求按D的升序输出。

输入例子:
100311

输出例子:
0:2

1:3

3:1
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
map<char,int> m;
int main()
{
    string s;
    cin>>s;
    for(int i=0;i<s.size();i++)
    {
        m[s[i]]++;
    }
    for(map<char,int>::iterator it=m.begin();it!=m.end();it++)
    {
        cout<<it->first<<":"<<it->second<<endl;
    }
    return 0;
}

D进制的A+B (20)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数。

输入描述:
输入在一行中依次给出3个整数A、B和D。


输出描述:
输出A+B的D进制数。

输入例子:
123 456 8

输出例子:
1103
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
 
int main()
{
    int x[30];
    long long a,b,c;
    int d,i=0;
    cin>>a>>b>>d;
    c=a+b;
    while(c)
    {
        x[i++]=c%d;
        c/=d;
    }
    for(int j=i-1;j>=0;j--)
        printf("%d",x[j]);
    printf("\n");
    return 0;
}

组个最小数 (20)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:

给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。



现给定数字,请编写程序输出能够组成的最小的数。

输入描述:
每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空

格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。


输出描述:
在一行中输出能够组成的最小的数。

输入例子:
2 2 0 0 0 3 0 0 1 0

输出例子:
10015558
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
#include <algorithm>
using namespace std;
 
int main()
{
    string str;
    cin>>str;
    int len=str.size();
    int pos=str.find('E')+1;
    int flag;
    if(str[pos]=='+')
        flag=1;
    else
        flag=-1;
    int d=0;
    for(int i=pos+1; i<len; i++)
    {
        d=d*10+str[i]-'0';
    }
    d=flag*d;
    if(str[0]=='-')
    {
        cout<<"-";
    }
    if(d<0)
    {
        d=-d;
        printf("0.");
        for(int i=0; i<d-1; i++)
            printf("0");
        for(int i=1; i<pos-1; i++)
        {
            if(str[i]=='.')
                continue;
            cout<<str[i];
        }
    }
    else
    {
        int x=0;
        cout<<str[1];
        for(int i=3; i<pos-1; i++)
        {
            if(str[i]=='.')
            {
                continue;
            }
            cout<<str[i];
            x++;
            if(x==d)
                cout<<".";
        }
        while(x<d)
        {
            cout<<"0";
            x++;
        }
 
    }
 
    return 0;
}

反转链表 (25)

时间限制 2000 ms 内存限制 150400 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为

3→2→1→6→5→4;如果K为4,则输出应该为4→3→2→1→5→6,即最后不到K个元素不反转。

输入描述:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数正整数N(<= 105)、以及正整数K(<=N),即要求反转的

子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。



接下来有N行,每行格式为:



Address Data Next



其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。


输出描述:
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

输入例子:
00100 6 4

00000 4 99999

00100 1 12309

68237 6 -1

33218 3 00000

99999 5 68237

12309 2 33218

输出例子:
00000 4 33218

33218 3 12309

12309 2 00100

00100 1 99999

99999 5 68237

68237 6 -1
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
struct Node
{
    int next;
    int data;
};
map<int,Node> m;
 
int main()
{
    int first,n,k,address,last;
    cin>>first>>n>>k;
    if(first==-1)
    {
        cout<<"-1"<<endl;
        return 0;
    }
    Node x;
    for(int i=0;i<n;i++)
    {
        cin>>address>>x.data>>x.next;
        m[address]=x;
    }
    if(k!=1)
    {
        vector<int> vec;
        address=first;
        for(int i=0;address!=-1;i=1)
        {
            bool flag=0;
            for(int j=0;j<k;++j)
            {
                vec.push_back(address);
                address=m[address].next;
                if(address==-1&&j!=k-1)
                {
                    flag=1;
                    break;
                }
            }
            if(flag)
                break;
            reverse(vec.begin(),vec.end());
            for(int j=0;j<k-1;j++)
            {
                m[vec[j]].next=vec[j+1];
            }
            m[vec[k-1]].next=address;
            if(i==0)
            {
                first=vec[0];
            }
            else
            {
                m[last].next=vec[0];
            }
            last=vec[k-1];
        }
    }
    address=first;
    while(address!=-1)
    {
        x=m[address];
        if(x.next!=-1)
        {
            printf("%05d %d %05d\n",address,x.data,x.next);
 
        }
        else
        {
           printf("%05d %d %d",address,x.data,x.next);
           cout<<endl;
        }
        address=x.next;
    }
    return 0;
}

程序运行时间(15)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所

耗费的时间。这个时间单位是clock tick,即“时钟打点”。同时还有一个常数CLK_TCK,给出了机器时钟每秒所走的时钟打点数。于是为了获

得一个函数f的运行时间,我们只要在调用f之前先调用clock(),获得一个时钟打点数C1;在f执行完成后再调用clock(),获得另一个时钟打点

数C2;两次获得的时钟打点数之差(C2-C1)就是f运行所消耗的时钟打点数,再除以常数CLK_TCK,就得到了以秒为单位的运行时间。



这里不妨简单假设常数CLK_TCK为100。现给定被测函数前后两次获得的时钟打点数,请你给出被测函数运行的时间。

输入描述:
输入在一行中顺序给出2个整数C1和C1。注意两次获得的时钟打点数肯定不相同,即C1 < C2,并且取值在[0, 107]


输出描述:
在一行中输出被测函数运行的时间。运行时间必须按照“hh:mm:ss”(即2位的“时:分:秒”)格式输出;不足1秒的时间四舍五入到秒。

输入例子:
123 4577973

输出例子:
12:42:59
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
 
int main()
{
    int first,second;
    cin>>first>>second;
    int d=(second-first);
    int h,m;
    double s;
    h=d/360000;
    d%=360000;
    m=d/6000;
    d%=6000;
    s=d/100.0;
    printf("%02d:%02d:%02.0f\n",h,m,s);
    return 0;
}


猜你喜欢

转载自blog.csdn.net/huanhuanxiaoxiao/article/details/78670400
今日推荐