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)这么多次就会循环了,好像挺好理解的吧