在竞赛中,我们认为计算机一秒能执行5×108次基本计算,如果题目给出的时间限制为1秒,那么你选择的算法执行的计算次数最多应该在108量级才有可能解决这个题目。
Tips: 在求空间复杂度时,特别地,在使用函数递归地时候,别忘了递归消耗的栈空间。
例子1:
例子2:优化抢气球
#include <iostream>
#include <algorithm>
using namespace std;
struct Node {
int h, id;
} stu[100005];
bool cmp(Node p1, Node p2) {
return p1.h < p2.h;
}
int ball[100005], ans[100005];
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> stu[i].h;
stu[i].id = i;
}
for (int i = 0; i < m; i++) {
cin >> ball[i];
}
sort(stu, stu + n, cmp);
sort(ball,ball+m);
int pos=0;
for(int i=0;i<n;i++){
while(pos<m&&ball[pos]<=stu[i].h){
ans[stu[i].id]++;
pos++;
}
}
for (int i = 0; i < n; i++) {
cout << ans[i] << endl;
}
return 0;
}
例子3:因数和
例子4:计算因数和(一)
思路:
完整代码
/*#include <iostream>
#include <cstdio>
using namespace std;
int main() {
//freopen("factor.in", "r", stdin);
//freopen("factor.out", "w", stdout);
int n;
cin >> n;
int sum=0;
for(int i=1;i<=n;i++){
if(n%i==0){
sum+=i; //运行超时
}
}
cout<<sum;
return 0;
}*/
/*#include <iostream>
#include <cstdio>
#include<cmath>
using namespace std;
int main() {
// freopen("factor.in", "r", stdin);
//freopen("factor.out", "w", stdout);
int n;
cin >> n;
int sum=0;
int i;
for (i = 1; i*i<=n; i++) {
if (n % i == 0){
if(i==1||i*i==n){
sum+=i;
}else{
sum+=i+n/i;
}
}
}
cout<<sum;
return 0;
} */
/*#include <iostream>
#include <cstdio>
using namespace std;
int main() {
//freopen("factor.in", "r", stdin);
//freopen("factor.out", "w", stdout);
int n;
cin >> n;
long long sum=0;
for(int i=1;i*i<n;i++){//以根号n为界限
if(n%i==0){
sum+=i;//因数i
if(i*i!=n){
sum+=n/i;//剩余因数n/i
}
}
}
cout<<sum<<endl;
return 0;
}*/
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
//freopen("factor.in", "r", stdin);
//freopen("factor.out", "w", stdout);
int n;
cin >> n;
long long sum=0;
for(int j=1;j<=n;j++){
for(int i=1;i*i<j;i++){
if(n%i==0){
sum+=i;
if(i*i!=j){
sum+=j/i;
}
}
}
}
cout<<sum<<endl;
return 0;
}
例子5:计算因数和(二)
思路:
完整代码
/*#include <iostream>
#include <cstdio>
using namespace std;
int main() {
freopen("factor.in", "r", stdin);
freopen("factor.out", "w", stdout);
int n;
cin >> n;
long long sum=0;
for(int j=1;j<=n;j++){
for(int i=1;i*i<j;i++){
if(n%i==0){
sum+=i;
if(i*i!=j){
sum+=j/i;
}
}
}
}
cout<<sum<<endl;
return 0;
}*/
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
freopen("factor.in", "r", stdin);
freopen("factor.out", "w", stdout);
int n;
cin >> n;
long long sum=0;
for(int i=1;i<=n;i++){
sum+=n/i*i;
}
cout<<sum<<endl;
return 0;
}