本蒟蒻的第一篇题解
本题可以分为两个模块 我太聪明了
第一方面——几天取完
让我们分析一下样例
样例:8
可以化为:1 2 3 4 5 6 7 8
把x取余3,即每3位取一个
相当于取(去)1 4 7 三个数
即
int suan(int x){
if(x%3==0){
q=x/3;
a=x-q;
}else if(x%3==2){
q=(x+1)/3;---如果取余后不为0,给他加上以让他不为小数
a=x-q;
}else if(x%3==1){
q=(x+2)/3;---同上
a=x-q;
if(day==0){
day=tot+1;
}
}return a;
}
剩下:2 3 5 6 8
整一个计数器tot 每次取苹果调用计数器tot 即
tot++;
然后我们重复执行至小苹果数为0,然后break跳出
下一次取2 6
剩下:3 5 8
⊗以后每天就只能取余下的一个了
每次tot++
第二个模块——第n个在第几天取完
然后我们来解决时间问题
我们可以再设置一个计时器day
每次当取过一次过一天让它加加
我自己设了一个样例:10
当10%3时我们发现得1!!!
那么第一天就可以取走最后一个苹果了 这多简单
但是并不是所有的样例都这么水我们要考虑所有情况
如果我们想一想其中的规律每次取都是取剩下苹果中的第x位其中x%3==1
但是也有可能最后一位已经被取走了,因此上特判,在设day时标注day=0然后在计数函数中加入
if(day==0){
day=tot+1;——取最后一位就是在tot+1那一天
}
最后输出tot+空格+day
warning:必需要打印空格,要不全WA
直接AC
考场代码:
#include<bits/stdc++.h>
using namespace std;
unsigned long long a,b,tot,day=0,q;
int suan(int x){——创建一个计算函数
if(x%3==0){——把x取余3以判断怎么取
q=x/3;
a=x-q;
}else if(x%3==2){
q=(x+1)/3;
a=x-q;
}else if(x%3==1){
q=(x+2)/3;
a=x-q;
if(day==0){
day=tot+1;
}
}return a;
}
int main(){
// freopen("apple.in","r",stdin);
// freopen("apple.out","w",stdout);
cin>>a;b=a;
while(1){
if(a==0){重复执行至a为0即至苹果全部取完
break;跳出
}
a=suan(a);调用函数计算
tot++;每次运行调用计数器
}cout<<tot<<" "<<day; 别忘空格!!!
return 0;
}