PAT乙级(C++)1016-1020

1016. 部分A+B

正整数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的值。

输入样例1:
3862767 6 13530293 3
输出样例1:
399

输入样例2:
3862767 1 13530293 8
输出样例2:
0


#include <iostream>
using namespace std; 
int main(){
    string s1,s2;
    int d1,d2;
    long sum1=0,sum2=0;
    cin>>s1>>d1>>s2>>d2;
    for(int i=0;i<s1.length();i++){
        if(s1[i]-'0'== d1){
            sum1=sum1*10+d1;
        }
    }
    for(int i=0;i<s2.length();i++){
        if(s2[i]-'0'==d2){
            sum2=sum2*10+d2;
        }
    }
    cout<<sum1+sum2;
    return 0;
}

1017. A除以B

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

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

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

输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3


思路:少于1000位的正整数显然不能用int,long类型进行计算,string类型存储数据,模拟做除法的过程即可。


#include <iostream>
using namespace std;
int main(){
    string s1,result1="";//result1为商
    long d,temp=0;//temp为余数
    cin>>s1>>d;
    for(int i=0;i<s1.length();i++){
        temp = temp*10+s1[i]-'0';
        if(temp>=d){
            char c = temp/d+'0';
            result1 = result1+ c;
            temp = temp%d;
        }
        else if(result1.length()!=0){
            result1 = result1+'0';
        }
    }
    if(result1.length()==0)
        result1 = "0";
    cout<<result1<<" "<<temp;   
    return 0;
}

1018. 锤子剪刀布

大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:

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

输入格式:
输入第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>
using namespace std;
int main(){
    int N=0;
    char jiw,yi;
    int result[2][6] ={0};
    cin>>N;
    for(int i=0;i<N;i++){
        cin>>jiw>>yi;
        if(jiw=='B'){
            if(yi=='B'){
                result[0][1]++;
                result[1][1]++;
            }
            else if(yi=='C'){
                result[0][0]++;
                result[1][2]++;
                result[0][3]++;
            }
            else{
                result[0][2]++;
                result[1][0]++;
                result[1][5]++;
            }

        } 
        else if(jiw=='C'){
            if(yi=='C'){
                result[0][1]++;
                result[1][1]++;
            }
            else if(yi=='J'){
                result[0][0]++;
                result[0][4]++;
                result[1][2]++;
            }
            else{
                result[0][2]++;
                result[1][0]++;
                result[1][3]++;
            }
        }
        else{
            if(yi=='J'){
                result[0][1]++;
                result[1][1]++;
            }
            else if(yi=='B'){
                result[0][0]++;
                result[1][2]++;
                result[0][5]++;
            }
            else{
                result[0][2]++;
                result[1][0]++;
                result[1][4]++;
            }
        }
    } 
    cout<<result[0][0]<<" "<<result[0][1]<<" "<<result[0][2]<<"\n";
    cout<<result[1][0]<<" "<<result[1][1]<<" "<<result[1][2]<<"\n";

    int index1=0,index2=0,num1=-1,num2=-1;
    for(int i=3;i<6;i++){
        if(result[0][i]>num1){
            index1=i;
            num1 = result[0][i];
        }   
        if(result[1][i]>num2){
            index2=i;
            num2 = result[1][i];
        }
    }

    if(index1 == 3)
        cout<<'B'<<' ';
    else if(index1==4)
        cout<<'C'<<' ';
    else
        cout<<'J'<<' ';


    if(index2 == 3)
        cout<<'B';
    else if(index1==4)
        cout<<'C';
    else
        cout<<'J';  
    return 0;
}

1019. 数字黑洞

给定任一个各位数字不完全相同的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位数格式输出。

输入样例1:
6767
输出样例1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174

输入样例2:
2222
输出样例2:
2222 - 2222 = 0000


注意1:当输入0的时候,是没有输出的
注意2:当输入6174的时候,是有输出的7641 - 1467 = 6174


#include <stdio.h>
#include <algorithm> 
using namespace std;

int cmp(int a,int b){
    return a>b;
}
int main(){
    int d1[4],num;
    int maxsum, minsum;
    scanf("%d",&num);

    while(num!=0){
        int temp =num;
        d1[0] = temp%10;
        temp = (temp - temp%10)/10; 
        d1[1] = temp%10;
        temp = (temp - temp%10)/10; 
        d1[2] = temp%10;
        temp = (temp - temp%10)/10; 
        d1[3] = temp%10;    

        sort(d1,d1+4,cmp);
        maxsum = d1[0]*1000+d1[1]*100+d1[2]*10+d1[3];
        minsum = d1[0]+d1[1]*10+d1[2]*100+d1[3]*1000;
        num = maxsum-minsum;
        printf("%04d - %04d = %04d\n",maxsum,minsum,num);
        if(num==0 || num==6174)
            break;      
    }   
    return 0;
}

1020. 月饼

月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。

注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有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 <algorithm> 
using namespace std;

struct mooncake{
    float value;
    float weight; 
};

int cmp(mooncake a,mooncake b){
    float yb1 = a.value/a.weight;
    float yb2 = b.value/b.weight;
    return  yb1>yb2; 
}

int main(){
    int N,All;
    float maxValue;
    cin>>N>>All;
    mooncake *allGoods = new mooncake[N];
    for(int i=0;i<N;i++){
        cin>>allGoods[i].weight;
    }
    for(int i=0;i<N;i++){
        cin>>allGoods[i].value;
    }

    sort(allGoods,allGoods+N,cmp);

    int sum = 0,j=0;
    float meanValue; 

    while(true){
        if(j==N)
            break;  
        if((sum + allGoods[j].weight)>All){
            meanValue = allGoods[j].value/allGoods[j].weight; 
            maxValue = maxValue + (All-sum)*meanValue;
            break;
        }
        else{
            sum = sum + allGoods[j].weight;
            maxValue = maxValue +allGoods[j].value;
            if(sum == All)
                break;
            j++;
        }   
    }
    printf("%.2f",maxValue);
    return 0;   
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值