ACM练习(7.4)

平台:洛谷

版块:入门综合训练1

题例:淘淘摘苹果

解题思想: 懂得灵活分析题意,把每个苹果需要消耗力气排序,从消耗的最小力气开始选对应的苹果,直到力气全部用完

 也可以用背包问题的思想求解

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     int n,s, ch, armh, count = 0;//苹果数量、力气总数、椅子高度、手臂高度、摘到的苹果数 
 7     cin >> n >> s >> ch >> armh;
 8     
 9     int maxh = ch+armh; //手臂加椅子最大高度 
10     int app[n], app_s[n]; //苹果高度、耗费的力气数 
11     
12     for(int i = 1; i<=n; i++)
13     cin>> app[i]>> app_s[i];
14     
15     for(int i = 1; i<n; i++)//按耗费的力气大小升序排列app[n]和app_s[n] 
16     for(int j = i+1; j<=n; j++)
17     {        
18         int temp1,temp2;
19         if(app_s[i]>app_s[j])
20         {
21             temp1 = app[i]; app[i] = app[j]; app[j] = temp1;
22             temp2 = app_s[i]; app_s[i] = app_s[j]; app_s[j] = temp2;
23         }
24     }
25     
26     for(int i = 1;i<=n; i++) 
27     {
28         if(app[i]<=maxh)
29         {
30             count++;
31             s-=app_s[i];
32         }
33         if(s<0)
34         {
35             count--;
36             break;
37         }
38     }
39     cout<<count<<endl;
40     return 0;
41 }

题例2:三连击(升级版)

解题要点:

1)要巧妙的筛选数据,暴力匹配会出现小数位,小数位的计算会在之后的查找中出现误差,导致查找不完善。灵活处理保证得到的数都是a的整数倍。

2)后面过滤数据部分,直接判断得到数据每位数的“和”与“积”是否与1-9的“和”与“积”相等,避免繁琐的逐个判断

 

代码:

 1 #include<stdio.h>
 2 int min(int x,int y)
 3 {
 4     if(x<y)return x;
 5     else return y;
 6 }
 7 
 8 int main()
 9 {
10     int a,b,c,flag=0;
11     int arr[9];
12     int x,y,z;
13     scanf("%d%d%d",&a,&b,&c);    
14     //***保证每一个i都是a的整数倍 
15      for(int i=(123/a+min(123%a,1))*a;i<=987/a*a;i+=a)
16     {
17         x=i;
18         y=x/a*b;
19         z=x/a*c;
20         
21         arr[0]=x/100;
22         arr[1]=(x/10)%10;
23         arr[2]=x%10;
24         
25         arr[3]=y/100;
26         arr[4]=(y/10)%10;
27         arr[5]=y%10;
28         
29         arr[6]=z/100;
30         arr[7]=z/10%10;
31         arr[8]=z%10;
32         
33         int sum=0; 
34         long int pro=1;    
35        for(int i=0;i<9;i++) 
36        {
37            pro*=arr[i];
38            sum+=arr[i];
39         } 
40         //1-9和尾45,积为362880 
41         if(pro==362880&&sum==45)
42         {
43             printf("%d %d %d\n",x,y,z);
44             flag=1;
45         }    
46     }
47     if(flag==0)printf("No!!!\n");
48     return 0;
49 }

题例3:哥德巴赫猜想(每个奇数都可以用三个质数表示),输入一个奇数,输出三个质数

解题要点:

1)暴力法,找出两个数i,j(两层循环),第三个数k=n-i-j(减少一层循环),若i,j,k都为素数,输出

2)判断素数的方法(直接法、欧拉法、埃式筛法)

 

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int Sushu(int n)
 5 {
 6     int j;
 7     for( j=2;j<=sqrt(n);j++)
 8         if(n%j==0)return 0;
 9         if(j>sqrt(n))return 1;
10         else return 0;
11 }
12 
13 int main()
14 {
15     int n;
16     int i,j,k;
17     cin>>n;
18     for( i=2;i<n;i++)
19     for( j=2;j<n;j++)
20     {
21         if((i>2&&i%2==0)||(j>2&&j%2==0))continue;
22         k=n-i-j;
23         if(Sushu(i)==1&&Sushu(j)==1&&Sushu(k)==1&&k)
24         {
25                 cout<<i<<" "<<j<<" "<<k;
26                 return 0;
27         }
28         
29     }
30     return 0;
31 }
哥德巴赫猜

 

 题例4:烤鸡问题

解题思想:暴力求解,深度搜索,十种调料,分别用十个循环,把每种情况的和加起来看是否等于所给条件n,等于则输出,不等于则进入下一次循环

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int m[10000000]={0};
 5 int main()
 6 {
 7     int n,a,b,c,d,e,f,g,h,i,j,k=0,count=0;
 8     cin>>n;
 9     if(n<10||n>30)
10     {
11     cout<<"0\n";
12     return 0;
13     } 
14     if(n==10)
15     {   
16     cout<<"1\n";
17     for(int i=0;i<10;i++)
18         cout<<"1 ";
19         return 0;
20     }
21     
22     if(n==30)
23     {
24         cout<<"1\n";
25     for(int i=0;i<10;i++)
26       {
27         cout<<"3 ";
28         return 0; 
29       }
30     }
31     
32     for(a=1;a<=3;a++)
33     for(b=1;b<=3;b++)
34     for(c=1;c<=3;c++)
35     for(d=1;d<=3;d++)
36     for(e=1;e<=3;e++)
37     for(f=1;f<=3;f++)
38     for(g=1;g<=3;g++)
39     for(h=1;h<=3;h++)
40     for(i=1;i<=3;i++)
41     {
42         j=n-a-b-c-d-e-f-g-h-i;
43         if(j>=1&&j<=3)
44         {
45             count++;
46             m[k++]=a;
47             m[k++]=b;
48             m[k++]=c;
49             m[k++]=d;
50             m[k++]=e;
51             m[k++]=f;
52             m[k++]=g;
53             m[k++]=h;
54             m[k++]=i;
55             m[k++]=j;
56         }
57     }
58     
59     int l=0;
60     cout<<count<<endl;
61     for(int x=0;x<k;x++)
62     {
63         l++;
64         cout<<m[x]<<" ";
65         if(l%10==0)cout<<endl;
66     }
67     return 0;
68     }
烤鸡问题

 

posted @ 2019-07-05 09:50  SUHANG苏航  阅读(190)  评论(0编辑  收藏  举报