HDU刷题三

1010:给出地图的长宽,和限制步数,地图中X是墙,S是起点,D是门,.是空,问能否在限制步数中从S走到D,思路:广搜打标记即可,要加速的话就双向广搜

1011:带领m个士兵,存在n个房间;每个房间有两个参数:放置的bugs数以及存在头领的可能性。
每个士兵可以抵抗20个bugs,只有消灭房间中的所有bugs,才可以得到该房间的头领的可能性。
有指定的房间与房间之间的联通性,要到达下一个房间,必须先将当前房间的bugs全部消除;并且走过的房间就不再到达。
问有m个士兵的情况下,怎样使最后得到的头领的可能性最大,最大为多少?

题解:搜索,对每个房间,除去它本身所需要的士兵,其他的士兵就可以提供给它的子房间进行选择,子房间将其最优的选择提供给父节点,父节点通过子房间的解得到最优解(不需要本房间通关即可打下一关!)

dp[i][j]=max(dp[i][j],dp[i][j-k]+dp[son(i)][k]),dp[i][j]表示第i个房间以及其子节点花费j个士兵可以得到的最大价值

#include
using namespace std;
int dp[105][105],a[105][105],value[105],p[105],v,n,visit[105];
int maxn(int a1,int b1){//返回较大者
    if(a1=tem;j--)//士兵数倒序遍历1,当前房间的花费士兵数,最多是全部花完,最少是花TEM个
                for(int k=1;k<=j-tem;k++)//士兵数顺序遍历2,全部在当前房间的情况开始时就已经更新好了,所以是遍历往儿子房间放的士兵数,1到j-tmp个
                    dp[now][j]=maxn(dp[now][j],dp[now][j-k]+dp[i][k]);
        }//当前now房间起花费J个士兵所能获得的最大价值=已更新价值+当前房间花j-k个,然后i号房间花k个的价值之和
}
int main(){
    freopen("1.txt","r",stdin);
    while(cin>>n>>v){//N个士兵,V个房间
         if(n==-1&&v==-1)break;//如果都是-1就跳出程序
         if(v==0){//如果没有士兵的话就直接跳出吧
              cout<<"0"<>value[i]>>p[i];//否则就输入每个房间的敌人和价值
         memset(a,0,sizeof(a));//A数据每次先清空
         for(int j=0;j>temp1>>temp2;//连通的两个房间编号
             a[temp1][temp2]=a[temp2][temp1]=1;//邻接矩阵记为1
         }
         memset(dp,0,sizeof(dp));//更新DP数据准备深搜
         DFS(1,-1);//深搜开始
         cout<

1012:给出e的逼近公式,就是泰勒展后,然后求前十项的值
题解:水题,模拟即可

#include
using namespace std;
int main(){
    cout<<"n e"<

1013:输入一个数,求两位和,输出一个数
题解:模拟即可

#include
using namespace std;
int main(){
    int n;cin>>n;
    while(n!=0){
        int tmp=0;
        while(n>0){
            tmp+=n%10;
            n/=10;
        }
        if(tmp<10){
            cout<>n;
        }
        else n=tmp;
    }
    return 0;
}


1014:给出STEP与MOD,seed从0开始,seed(x+1)=[seed(x)+STEP]%MOD,若循环变0之前1到N-1都出现一次就是good,否则bad,判断good/bad
题解:STEP与MOD互质就可以,想到这里就做完了
证明:题意讨论的是0开始加若干个STEP后能被MOD除尽
那么如果STEP与MOD互质,则只能是加MOD次,那中间MOD-1次加完的数肯定是不同的,所以就肯定是1到N-1了
(因为对中间MOD-1个数为起点分析,往后也要加MOD次才会重复出现!)
反过来,若不互质,则只需要加MOD/GCD(STEP,MOD)这么多次就会循环了,好像挺好理解的吧

你可能感兴趣的:(算法训练)