周期性问题,虽然逐个枚举判断也能处理,但是最优解为考虑不完整后期中的有效游泳天数。
// 题目编号:12401 - 小鱼的航程(改进版)
#include<bits/stdc++.h>
using namespace std;
int main(){
int x,n,y,ans=0;
cin>>x>>n;
for(int i=x;i<=x+n%7-1;i++)
if(i%7!=0&&i%7!=6) ans++;
cout<<(ans+n/7*5)*250;
return 0;
}
水题,主要题意理解清楚,如果某个人的取药无法完成,下一个人继续
// 题目编号:13416 - 药房管理
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n,num,ans=0;
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>num;
if(m>=num) m-=num;
else ans++;
}
cout<<ans;
return 0;
}
模拟除法运算过程,循环处理
// 题目编号:13441 - 求小数的某一位
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,n,s;
cin>>a>>b>>n;
a*=10;
for(int i=1;i<=n;i++){
s=a/b;
a=a%b*10;
}
cout<<s;
return 0;
}
辗转相除法,注意数据范围,要开 long long
// 题目编号:221249 - 求最大公约数
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a,b,y;
cin>>a>>b;
while(a%b!=0){
y=a%b;
a=b;
b=y;
}
cout<<b;
return 0;
}
为提高效率,此题要通过递推公式先打表,填充数组。 递推公式易得 f(n)=f(n-1)+2*f(n-2)
// 题目编号:31014 - 小明的烦恼
#include<bits/stdc++.h>
using namespace std;
int a[31],n,num;
int main(){
a[1]=1,a[2]=3;
for(int i=3;i<=30;i++)
a[i]=a[i-1]+2*a[i-2];
cin>>n;
while(n--){
cin>>num;
cout<<a[num]<<endl;
}
return 0;
}
01背包模板题
// 题目编号:62001 - 01背包问题
#include<bits/stdc++.h>
using namespace std;
int m=10,n=4,maxv=0,w[50],v[50],f[201];
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>w[i]>>v[i];
}
for(int i=1;i<=n;i++){
// 这里要逆序推导
for(int j=m;j>=w[i];j--){
f[j]=max(f[j],f[j-w[i]]+v[i]);
}
}
cout<<f[m];
return 0;
}
同学们要理解,并在题库中找到题目AC,切勿CTRL C!