先是28,前一个人24,因此差值为4,而下一个人差值为5.
因此接下来的所有人都是报24+4,超过k值时(24+4+5)%k,下一个为(24+4+5+6)%k
换算成数字之间的问题便为(24+4n+1+2+3)%k,1+2+3则可以用for循环来表示,所以可以用一层for循环来计算
i++;
delta=delta+i;
最后对总数求模且记录次数,因此只要确认起始值和初识差值n。
解题思路:
输入nn个人,kk值,tt轮数
建立a数组为tt大小且将a数组第一个数赋值为1,
计算delta为小于人数的i自增循环,表示过了一轮应该添加的delta值
第二个for计算几轮后小明该输出的值
第三个for循环是将所有轮数该输出的值相加
总结:输入人数,k值,以及轮数,则可以得到每轮输出值
可以通过假想法来确认数字间的规律
!!!但这会遇到int类型tt大小不够
优化版本:
直接用first和second来代替a[i-1]和a[i],将first不断刷新,但用sum保留second累加的值
最后输出,就不会因为tt过大而int a[tt]溢出所带来的问题
为了防止过大可以将p提前求余,其次改为long long类型也能扩大变量类型大小
蛇形矩阵(建立指针)(多个for嵌套)
建立一个指针
其呈现105×105的空间,按照
0,1,2,3,...,98,99
1,
2,
...,
98,
99
排列
因此定义vis[0][0]=1;
解题思路:
1.建表期间
先创立一个指针来存放100长度的蛇形矩阵,并在vis[0][0]=1
再利用for来计算每个列数字(每个列的数字等于上一个数字加上rows++,rows初始时定义为会自增的1)
用第一层for循环来计算行所需要的次数,再用第二层for循环来确定每个输出的数字
再建立一个会自增的delta,每行的下一个数字都等于上一个数字加上delta++,初识值为2
2.输出表
利用第一层for来输出列数(补回车)
第二层for循环输出一行的数字,并且在每个数字后输出空格,加上判断来不输出最后一个的空格
优化版本:
由于我们输入表时只使用了一半左右的空间,因此产生了部分空间的浪费
使用vector(容器)
sort的灵活运用(头文件algorithm)
解题思路:
建变量:
先根据输入要求建立两个输入数组,其中w为两个纪念品最高价格和
nn为纪念品数量,再用for循环来输入每个纪念品价值,
用sort函数将数组a中升序排列,建立f为数组a中第一个下标,
l为a数组中最后一个下标,number为组数
核心算法:
从第一个纪念品和最后一个纪念品开始相加,
(1)如果相加小于等于最高值w,
则可以number++且l--,f++,
(2)如果相加大于w,则不能成组,number++且只l--,
在不知道循环次数下,用whlie循环,条件为f
(3)如果f等于l则到了数值中间只能单独成组,则number++
输出number