P2437蜜蜂路线
1.该题目应使用高精度(血的教训)
2.应用斐波那契数列:f(i)=f(i-1)+f(i-2)就可以转化为从m到n的路线数等价于1到m-n的路线数,代码如下:
void cal(int index){
int x=0;
int i=1;
while(i<=lens){
f[index][i]=f[index-1][i]+f[index-2][i]+x;
x=f[index][i]/10;
f[index][i]%=10;
i++;
}
if(x>0){
lens++;
f[index][lens]=x;
}
}
3.数列的前两项应赋值为1和2
4.使用二维数组比较好,主代码如下:
int main(){
cin>>m>>n;
f[1][1]=1,f[2][1]=2;
for(int i=3;i<=n-m;i++){
cal(i);
}
for(int i=lens;i>=1;i--){
cout<<f[n-m][i];
}
return 0;
}
P1478陶陶摘苹果
1.该题使用贪心思想:先摘花费力气小的苹果(前提是能够得到,记得判断一下):
bool cmp(apple a1,apple a2){
if(a1.y!=a2.y){
return a1.y<a2.y;
}
return a1.x<a2.x;
}
2.可以使用结构体:
struct apple{
double x,y;
}ap[5002];
3.(没有了~~)这道题很简单,但要讲究做题策略,不会就跳过,先做会的题
主干如下:
for(int i=1;i<=n;i++){
if(ap[i].x<=(a+b)){
sum+=ap[i].y;
if(sum<=s){
cnt++;
}
else break;
}
}
cout<<cnt<<endl;
P2249查找
1.本题可以使用二分答案法:
int sea(int arr[],int n,int x){
int high=n,mid,low=1,res=-1;
while(low<=high){
mid=(high+low)/2;
if(x==a[mid]){
res=mid;
high=mid-1;
}
else if(a[mid]>x){
high=mid-1;
}
else low=mid+1;
}
return res;
}
(额~~好像也没有别的了)(那我还是错了)(干嘛,哎呦~~)
(奉劝各位一句,一定要多做题)