- 第几个数
- 题目
- 思路
- 遇到的问题
- 源代码
- 收获
- 最少 *** 作次数
- 题目
- 思路
- 遇到的问题
- 源代码
- 收获
- 计算小费
- 题目
- 思路
- 遇到的问题
- 源代码
- 收获
- 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<t; j++)
{
memset(num,0,sizeof(num));
re = 0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&num[i]);
}
DataSort(num,n);
re = num[0]-num[n-1];
printf("%d\n",re);
}
}
void DataSort(int num[],int n)
{
int i,j,k,temp;
for(i=0; i<n-1; i++)
{
k=i;
for(j=i+1; j<n; 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("%d\n",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("-1\n");
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("%d\n",sum);
}
}
收获
本题的关键就是找到那个节点:二月底之前或之后。
希望下次可以独立做出。
整型存储范围
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)