题意
数学抽象:给定n,初始计数为0,对于n>=2,每次n-=2,计数加1,求最终计数
每次最多10组数据,每个数据不超过100
方法
朴素实现
把数学抽象后的题意转换成代码
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
while(true){
int n;
cin>>n;
if(n==0)break; // 结束标识
int r = 0; // 计数
while(n>=2){ // 不小于2
r++; // 计数+1
n-=2; // n-=2
}
cout<<r<<endl;
}
return 0;
}
复杂度分析
设值最大为v, 数据组数为n
时间复杂度: 我们对于每个数据,进行了O(v)的操作,所以总时间复杂度为O(nv)
空间复杂度: 没有任何数组,只使用了常数大小的空间,所以空间复杂度为O(1)
数学
虽然这里的上限只有100,但如果范围更大也会超时。
值 | 次数 | 值/2 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
2 | 1 | 1 |
3 | 1 | 1 |
4 | 2 | 2 |
5 | 2 | 2 |
6 | 3 | 3 |
7 | 3 | 3 |
8 | 4 | 4 |
8 | 4 | 4 |
通过尝试前面的值,或观察每次减2的运算,不难发现,次数刚好等于整除2,所以这里减去相同的值多次可以用除法代替。
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
while(true){
int n;
cin>>n;
if(n==0)break;
cout<<n/2<<endl; // 直接除以2替代上面的循环
}
return 0;
}
复杂度分析
设值最大为v, 数据组数为n
时间复杂度: 我们对于每个数据,直接除法运算,所以总时间复杂度为O(n)
空间复杂度: 没有任何数组,只使用了常数个临时变量,所以空间复杂度为O(1)