目录
P9748 [CSP-J 2023] 小苹果
思路
代码
P7071 [CSP-J2020] 优秀的拆分
思路
代码
P9748 [CSP-J 2023] 小苹果
P9748 [CSP-J 2023] 小苹果
思路
先写几个看看规律
题意我们能看出来是三个三个一组的,然后每次取走的都是三个里面的第一个。我们应该很容易想到如果一轮的总数是三的倍数的话,那直接取走的个数就是倍数,那么对应就会想到如果不是恰好是三的倍数,我们发现取走的个数仍然是这个倍数,说明我们这里是向上取整的。
这里我们可以按我们想的写个if语句执行不同的情况。也可以直接使用向上取整,由于我们这里是对三向上取整,因此我们选择在原数上+2,使得在有余数的情况下,商能够增加1。因此这个式子:(n+2)/3就是对3向上取整的操作。
同样对于其他的对4向上取整就是(n+3)/4....这个可以记住. (n+k−1)/k是对 k 向上取整的通式。
到这里第一问应该很容易得出。
第二问问我们n是在哪一天取走的。做的时候一致没写出来qaq,看了题解才明白。
我们会发现我们每次取走的都是三个三个一组的第一个,也就是说,如果此时这一轮的苹果数量对三取余得1的话,并且是第一次出现这个情况的时候,说明此时的这一天就是取走该苹果得这一天。注意这里是有两个要求的。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int n,d1,d2;
int main()
{
cin>>n;
int k=n;
while(k)
{
d1++;
if(d2==0 && k%3==1)d2=d1;
if(k%3)k-=k/3+1;
else k-=k/3;
}
cout<<d1<<" "<<d2;
return 0;
}
(我这里用k当替身进行操作是不必要的)
注意我们每一行代码放置的位置。我们while循环条件是k也就是苹果数不为0的时候,就一直执行。那么说明开始执行这个循环的时候就说明已经存在这一天了,我们接下来的循环内部的一些操作都是对这一天算上之后会产生的结果进行计算的,因此我们天数要在最开始直接++。明白这样梳理之后,关于第二问的计算也就是应该放在更改苹果数之前了。可以理解哈。
P7071 [CSP-J2020] 优秀的拆分
P7071 [CSP-J2020] 优秀的拆分
思路
这个数可以分为正整数个2的幂相加,首先想到这个数肯定是偶数,因此先判断奇偶,奇数直接输出-1
另外关于偶数,题目要求从大到小输出,因此我们要先找到最大的但又不能超过n的这个2的次幂,找到之后我们想剩下的数其实要做的是和我们这次的操作是一样的,因此想到需要一个while循环,我们发现在不断找到2的次幂后n的值每次会减小,直到n=0。因此我们发现外层也是一个while循环。
至此。
代码
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int main()
{
cin>>n;
int k=1;
if(n%2){
cout<<"-1";
return 0;
}
int cnt=0;
while(n)//只要n>0就一直执行循环寻找拆分方式
{
while(k<=n){//这里注意是要取等的
k*=2;
}
k/=2;//每次都找最大的
cout<<k<<" ";
n-=k;
k=1;//注意每次把k置1
}
return 0;
}
经过很多事情,对于学习这方面心态发生了很大的变化。嗯,,目前处于很模糊的状态....
有问题欢迎指出~加油!