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 }烤鸡问题
标签:题例,&&,int,app,练习,ACM,7.4,Sushu,include 来源: https://www.cnblogs.com/SUHANG12138/p/11135171.html