编程高手带你玩转碎纸机
来源:    发布时间: 2018-06-04 08:51   202 次浏览   大小:  16px  14px  12px
本文由编程高手带着我们玩转碎纸机,虽然很多人对编程不是很懂,但是我们可以从中了解到,无论什么行业,只要有需求,只要我们肯动脑筋,我们就能想出解决办法。

在我们现代生活中,各种各样的智能化的物品层出不穷,给我们的生活带来的极大的便利,这一切都离不开程序员的编程,今天我们一起欣赏一下编程高手如何玩转碎纸机,不懂程序没关系,纯欣赏一下。


描述 你现在负责设计一种新式的碎纸机。一般的碎纸机会把纸切成小片,变得难以阅读。而你设计的新式的碎纸机有以下的特点:


1.每次切割之前,先要给定碎纸机一个目标数,而且在每张被送入碎纸机的纸片上也需要包含一个数。

2.碎纸机切出的每个纸片上都包括一个数。

3.要求切出的每个纸片上的数的和要不大于目标数而且与目标数最接近。


举一个例子,如下图,假设目标数是50,输入纸片上的数是12346。碎纸机会把纸片切成4块,分别包含1,2,34和6。这样这些数的和是43 (= 1 + 2 + 34 + 6),这是所有的分割方式中,不超过50,而又最接近50的分割方式。又比如,分割成1,23,4和6是不正确的,因为这样的总和是34 (= 1 + 23 + 4 + 6),比刚才得到的结果43小。分割成12,34和6也是不正确的,因为这时的总和是52 (= 12 + 34 + 6),超过了50。


编程高手带你玩转碎纸机


还有三个特别的规则:

1.如果目标数和输入纸片上的数相同,那么纸片不进行切割。

2.如果不论怎样切割,分割得到的纸片上数的和都大于目标数,那么打印机显示错误信息。

3.如果有多种不同的切割方式可以得到相同的最优结果。那么打印机显示拒绝服务信息。比如,如果目标数是15,输入纸片上的数是111,那么有两种不同的方式可以得到最优解,分别是切割成1和11或者切割成11和1,在这种情况下,打印机会显示拒绝服务信息。



为了设计这样的一个碎纸机,你需要先写一个简单的程序模拟这个打印机的工作。给定两个数,第一个是目标数,第二个是输入纸片上的数,你需要给出碎纸机对纸片的分割方式。 输入 输入包括多组数据,每一组包括一行。每行上包括两个正整数,分别表示目标数和输入纸片上的数。已知输入保证:两个数都不会以0开头,而且两个数至多都只包含6个数字。


输入的最后一行包括两个0,这行表示输入的结束。

输出 对每一组输入数据,输出相应的输出。有三种不同的输出结果:


sum part1 part2 ...

rejected

error


第一种结果表示:

1.每一个partj是切割得到的纸片上的一个数。partj的顺序和输入纸片上原始数中数字出现的次序一致。

2.sum是切割得到的纸片上的数的和,也就是说:sum = part1 + part2 +...

第一种结果中相邻的两个数之间用一个空格隔开。


如果不论怎样切割,分割得到的纸片上数的和都大于目标数,那么打印“error”。

如果有多种不同的切割方式可以得到相同的最优结果,那么打印“rejected”。

样例输入

50 12346
376 144139
927438 927438
18 3312
9 3142
25 1299
111 33333
103 862150
6 1104
0 0


样例输出

43 1 2 34 6
283 144 139
927438 927438
18 3 3 12
error
21 1 2 9 9
rejected
103 86 2 15 0
rejected


[cpp] view plain copy
  1. #include <iostream>  

  2. #include <string.h>  

  3. #include <string>  

  4. #include <stdlib.h>  

  5. #include <stdio.h>  

  6. using namespace std;  

  7.  

  8. int Target;  

  9. string ans[100];  

  10. int anssum[100];  

  11. int count;  

  12. int m;  

  13. char s[20];  

  14.  

  15. void Judge(char *s)  

  16. {  

  17.    string t,strt1,strt2;  

  18.    int num[20],j=0,n=0,sum=0,k,i;  

  19.    char tem[20];  

  20.    t = s;  

  21.  

  22.    for(i=0; i < t.length(); i++)  

  23.    {  

  24.        if(t[i] == ' ')  

  25.            t.erase(i,1);  

  26.    }  

  27.  

  28.    for(i=0; i <= t.length(); i++)  

  29.    {  

  30.        if(t[i] == '+' || i==t.length())  

  31.        {  

  32.            strt1 = t.substr(j,i-j);  

  33.            t[i] = ' ';  

  34.            for(k=0;k<i-j;k++)  

  35.                tem[k] = strt1[k];  

  36.            tem[k] = '\0';  

  37.            num[n++]=atoi(tem);  

  38.            j=i+1;  

  39.        }  

  40.    }  

  41.  

  42.    sum=0;  

  43.  

  44.    for(i=0;i<n;i++)  

  45.    {  

  46.            sum += num[i];  

  47.    }  

  48.    if(sum <= Target)  

  49.    {  

  50.        ans[count]=t;  

  51.        anssum[count++]=sum;  

  52.        if(m<sum)  

  53.        {  

  54.            m = sum;  

  55.        }  

  56.    }  

  57.  

  58. }  

  59.  

  60. void Function(int t,bool b,char* s1)  

  61. {  

  62.    int i;  

  63.  

  64.    if(t==strlen(s))  

  65.    {  

  66.        Judge(s1);  

  67.  

  68.        return;  

  69.    }  

  70.    if(b)  

  71.    {  

  72.        s1[2*t]=s[t];  

  73.        Function(t+1,!b,s1);  

  74.    }  

  75.    else  

  76.    {  

  77.        char e[2]={'+',' '};  

  78.        for(i=0;i<2;++i)  

  79.        {  

  80.            s1[2*t-1] = e[i];  

  81.            Function(t,!b,s1);  

  82.        }  

  83.    }  

  84. }  

  85.  

  86. int main()  

  87. {  

  88.    int i,c;  

  89.  

  90.    while(cin>>Target>>s)  

  91.    {  

  92.        if(Target==0&&s[0]=='0')  

  93.            break;  

  94.        char s1[20]={0};  

  95.        c=0;  

  96.        count = 0;  

  97.        m = 0;  

  98.        int p;  

  99.        i=strlen(s);  

  100.        Function(0,1,s1);  

  101.  

  102.        for(i=0;i<count;i++)  

  103.        {  

  104.            if(anssum[i] == m)  

  105.            {  

  106.                p = i;  

  107.                c++;  

  108.            }  

  109.        }  

  110.        if(c==1)  

  111.            cout<<anssum[p]<<' '<<ans[p]<<endl;  

  112.        else if(c>1)  

  113.            cout<<"rejected"<<endl;  

  114.        else  

  115.            cout<<"error"<<endl;  

  116.  

  117.    }  

  118.    return 0;  

  119. }  


本文由编程高手带着我们玩转碎纸机,虽然很多人对编程不是很懂,但是我们可以从中了解到,无论什么行业,只要有需求,只要我们肯动脑筋,我们就能想出解决办法。


本文关键词:碎纸机

 
欢迎咨询范罗士产品
 
QQ  售前咨询
QQ  售后咨询