一个院级的acm小选拔赛,遇到的几个简单题目,这里做下总结
越野跑问题
#include <iostream>
using namespace std;
int main()
{
int M,T,U,F,D,sum=0;
cin>>M>>T>>U>>F>>D;
char *s=new char[T+1];
for(int i=0;i<T;i++)
cin>>s[i];
s[T]='\0';
int j;
for(j=0;j<T;j++)
{
if(s[j]=='f') sum+=F*2;
else sum+=U+D;
if(sum>M) {cout<<j;break;}//j为数组下标,所以加一表所跑段数
}
if(j==T-1) cout<<j+1;
return 0;
}
采药问题(这道题目是动态规划DP的经典例题01背包问题)
#include <iostream>
//#include <algorithm>
using namespace std;
const int Tmax=1000;
const int Mmax=100;
int T,M;//总时间数和总株数
int *t=new int[M];
int *w=new int[M];
int dp[Mmax][Tmax]; //化数组记忆,话说动态二维数组怎么建?
int rec(int i,int j)
{
if(dp[i][j]!=-1) return dp[i][j];
int res;
if(i==M) res=0;//被迷惑了好久,这里的判断条件是M
else if(t[i]>j) res=rec(i+1,j);
else res=max(rec(i+1,j),rec(i+1,j-t[i])+w[i]);
dp[i][j]=res;
return res;
}
int main()
{
for(int i=0;i<Mmax;i++)
for(int j=0;j<Tmax;j++)
dp[i][j]=-1;
cin>>T>>M;
for(int i=0;i<M;i++)
{
cin>>t[i]>>w[i];
}
cout<<rec(0,T);
return 0;
}