9/17 越努力越幸运-思维赛(3.0) 解题思路
A
题意:给4个数,它们为3个数其中两两相加之和和三个数相加之和,求这三个
解题思路:先找出所给的4个数的最大值,然后用最大值从后面分别减去另外三个数输出的就是所求的三个数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<math.h> #include<string.h> int main() { int a,b,c,d,max=0,x[4],i; while(~scanf("%d%d%d%d",&a,&b,&c,&d)) { x[0]=a;x[1]=b;x[2]=c;x[3]=d; for(i=0;i<4;i++) { if(x[i]>max) max=x[i]; } if(max==a) printf("%d %d %d\n",max-d,max-c,max-b); else if(max==b) { printf("%d %d %d\n",max-d,max-c,max-a); } if(max==c) { printf("%d %d %d\n",max-d,max-b,max-a); } if(max==d) { printf("%d %d %d\n",max-c,max-b,max-a); } } return 0; }
B
题意:给一组数据,将其中的数+d或者-d或者不变然后都变为相同的数,如果能输出这个数,如果不能输出-1
解题思路:找出数组中的最大值和最小值,然后看a[i]是否等于(minn+maxx)/2
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 int main() 5 { 6 int n,a[110],b[110],i,min,max,x; 7 while(~scanf("%d",&n)) 8 { 9 for(i=0;i<n;i++) 10 scanf("%d",&a[i]); 11 12 min=a[0]; 13 max=a[0]; 14 for(i=0;i<n;i++) 15 { 16 if(a[i]<min) 17 min=a[i]; 18 if(a[i]>max) 19 max=a[i]; 20 } 21 int flag=1; 22 for(i=0;i<n;i++) 23 { 24 if(a[i]==min||a[i]==max) 25 { 26 continue; 27 } 28 else 29 if(a[i]!=min&&a[i]!=max&&a[i]==(max+min)/2&&(max+min)%2==0) 30 x=(max-min)/2; 31 else 32 { 33 flag=2; 34 printf("-1\n"); 35 break; 36 } 37 } 38 if(flag==1) 39 { 40 if(min%2==0&&max%2==0) 41 x=(max-min)/2; 42 else if(min%2!=0&&max%2!=0) 43 x=(max-min)/2; 44 else 45 x=max-min; 46 printf("%d\n",x); 47 } 48 } 49 return 0; 50 }
C
题意:一只猫每周的每一天吃的东西都不一样,现在给出每一样东西能吃的天数,求不间断的从周几开始吃能吃的最大天数
解题思路:找出能吃最少天数的食物,然后依次进行循环判断,记录下从开始到结束的天数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<math.h> #include<iostream> #include<algorithm> using namespace std; int main() { int k,i,a,b,c,m,n,p,minn; while(cin>>a>>b>>c) { m=a/3; n=b/2; p=c/2; minn=m; minn=min(minn,n); minn=min(minn,p); int sum=7*minn; m=a-minn*3; n=b-minn*2; p=c-minn*2; int j=7; int x[101]={0}; while(j--) { i=j+1; k=0; a=m; b=n; c=p; for(;i<=7;i++) { if(i==1||i==4||i==7) { if(a==0) break; a--; k++; x[j]=k; } if(i==2||i==6) { if(b==0) break; b--; k++; x[j]=k; } if(i==3||i==5) { if(c==0) break; c--; k++; x[j]=k; } if(i==7) i=0; } } sort(x,x+7); cout<<sum+x[6]<<endl; } }
D
题意:有两种电池能用与白天和晚上,白天用b电池能充电变为a电池,求所有的电池能用的最大天数
解题思路:先判断是白天还是晚上,然后决定用什么电池,依次进行判断直到结束
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<math.h> #include<iostream> #include<algorithm> using namespace std; int main() { int n,b,a,i,x[200010],count=0,p,q; while(cin>>n>>b>>a) { p=a;q=b; for(i=0;i<n;i++) cin>>x[i]; for(i=0;i<n;i++) { if(x[i]==0) { if(a>=1) { a--; count++; } else { b--; count++; } } else { if(a==p) { if(a>=1) { a--; count++; } else { b--; a++; count++; } } else { if(b>=1) { b--; a++; count++; } else { a--; count++; } } } if(a==0&&b==0) break; } cout<<count<<endl; } return 0; }