今天没搞其他的,就刷题(因为明天把电脑拿去修,之后就可能没什么时间去完成作业,也不知道什么时候修好)
写一点有趣的题:
1.问题描述
给出一个正整数n,求一个和最大的序列a0,a1,a2,……,ap,满足n=a0>a1>a2>……>ap且ai+1是ai的约数,输出a1+a2+……+ap的最大值
输入格式
输入仅一行,包含一个正整数n
输出格式
一个正整数,表示最大的序列和,即a1+a2+……+ap的最大值
怎么说呢,这题可以转换为单调递减并且彼此有关联的数列;
重点:提取前一个数列的最大公约数;
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,m,i,sum=0;
cin>>n;
m=n;
while(1)
{
for(i=m-1;i>=1;i--)
{
if(m%i==0)
{
sum+=i;
break;
}
}
m=i;
if(i==1)
break;
}
cout<<sum;
return 0;
}
2.
这题要处理凹凸之间的关系,我觉得可以把路段剁成两段,即凸凹,凹凸型(凹凸凹可以不考虑)(大方向);就一半而言,取决于最高的木板,最后累加;
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a[100000],i,sum=0;
cin>>n;
cin>>a[0];
for(i=1;i<n;i++)
{
cin>>a[i];
if(a[i]>a[i-1])
sum=sum+a[i]-a[i-1];
}
cout<<sum+a[0];
return 0;
}
3.
这题写过,值得回味:
#include<iostream>
using namespace std;
int main(){
long long t,i,n;
cin>>t;
for(i=0;i<t;i++)
{
cin>>n;
if(n<3)
cout<<n<<"\n";
else
{
long long m=0,x=n,y=n,sum=n;
while(1)
{
m=x/3+y/4;
x=(x%3+m);
y=y%4+m;
sum+=m;
if(x<3&&y<4)
break;
}
cout<<sum<<"\n";
}
}
return 0;
}
我今天写的其他代码就洒洒水啦