- 第几个数
- 题目
- 思路
- 遇到的问题
- 源代码
- 收获
- 最少操作次数
- 题目
- 思路
- 遇到的问题
- 源代码
- 收获
- 计算小费
- 题目
- 思路
- 遇到的问题
- 源代码
- 收获
- 18岁生日
- 题目
- 思路
- 遇到的问题
- 源代码
- 收获
- 额外知识点巩固
找寻规律,先定义中间值,然后通过k与中间值的比较后,得到其位于偶数数组或是奇数数组,而后得解。
遇到的问题- 本题起初思路为创建数组,前一半为奇数数组,后一半是偶数数组,然后再查找,但由于n,k数值过大,思路不通遂放弃
- 开始当成数学问题思考时,忘记了C中‘/’只保留整数,将数组长度为奇数或偶数分开讨论,其实不需要,直接mid = (n+1) / 2即可。
#include收获int main() { long long n,k,mid,num; scanf("%lld %lld",&n,&k); mid = (n+1)/2; if(k>mid) num = 2 * (k - mid); else num = 2 * k - 1; printf("%lld",num); }
规律的找寻很关键。
最少操作次数 题目 思路找寻规律。先对数组进行排序,然后用最大值减去最小值即为操作次数 。
因为操作结果只需要让最小的数等于最大的数即可满足题意。
开始以为是差分数组的应用,但是由于差分数组只能对一个区间的数值进行运算操作,而本题有多个不确定的区间,所以很难操作,开始卡在了这里,但其实本题是个规律题。
源代码#include收获#define N 60 void DataSort(int num[],int n); int main() { int n,t,i,j,num[N],re; scanf("%d",&t); for(j=0; j memset(num,0,sizeof(num)); re = 0; scanf("%d",&n); for(i=0; i scanf("%d",&num[i]); } DataSort(num,n); re = num[0]-num[n-1]; printf("%dn",re); } } void DataSort(int num[],int n) { int i,j,k,temp; for(i=0; i k=i; for(j=i+1; j if(num[j]>num[k]) { k=j; } } if(k!=i) { temp = num[k]; num[k]=num[i]; num[i]=temp; } } }
冒泡排序的巩固+找规律
计算小费 题目 思路关键点在于3和4可以组合成大于6的任何数;
即为150和200可以组合成大于300的任何数,而350在大于300后已经无用(可被前两数组合得到)。
经同学讨论后,感觉和哥德巴赫猜想有极小程度的相似(虽然本题中4不为素数且只有两个数)
感觉挺有意思的.
开始在下面的分支出现了问题,上界定在了350,忽略了2*150 = 300
else if(money>=200&&money<300)
tip = money - 200;
源代码
#include收获int main() { int money,tip,T; scanf("%d",&T); while(T--) { tip = 0; scanf("%d",&money); if(money<150) tip = money; else if(money>=150&&money<200) tip = money - 150; else if(money>=200&&money<300) tip = money - 200; else if(money>=300) tip = money % 50; printf("%dn",tip); } }
在多个数字加和求最优解时,注意观察这几个数字和的规律。
18岁生日 题目 思路关键节点在于生在2月底之前还是之后。例:
假设生于2019年2月,则到2020年2月时需要+365;
若生于2019年3月,则到2020年3月时需要+366。
即若生于2月底之前,看当年是否为闰年,若是则+366
若生于2月底之后,看下一年是否为闰年,若是则+366
自己未想出来,在网上找到原题后理解得答。
源代码#include收获int leap(int year) { if( (year % 4==0 && year % 100!=0) || year % 400==0) return 1; else return 0; } int main() { int i,n; scanf("%d",&n); while(n--) { int year,month,day,sum=0; scanf("%d-%d-%d",&year,&month,&day); if(month==2&&day==29) { printf("-1n"); continue; } if(month<=2) { for(i=0; i<18; i++) { if(leap(year+i))sum+=366; else sum+=365; } } else for(i=1; i<=18; i++) { if(leap(year+i))sum+=366; else sum+=365; } printf("%dn",sum); } }
本题的关键就是找到那个节点:二月底之前或之后。
希望下次可以独立做出。
整型存储范围



