noip2013day2题解

积木大赛:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;

int getint()
{
	int i=0;char c;
	for(c=getchar();c<'0'||c>'9';c=getchar());
	for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';
	return i;
}

const int N=100005;
int n,ans,a,b;

int main()
{
	//freopen("lx.in","r",stdin);
	n=getint();
	for(int i=1;i<=n;i++)
	{
		b=getint();
		if(b>a)ans+=b-a;
		a=b;
	}
	cout<<ans;
	return 0;
}
花匠:

# include <iostream>
# include <algorithm>
# include <string>
# include <cstring>
# include <cmath>
# include <ctime>
# include <cctype>
# include <cstdlib>
# include <cstdio>
# include <vector>
# include <queue>
using namespace std;


long long Read()
{
	long long i=0,f=1;char c=getchar();
	while(c>'9'||c<'0') {if(c=='-') f=-1; c=getchar();}
	while(c>='0'&&c<='9') {i=i*10+(c-'0'); c=getchar();}
	return f*i;
}
int dp[100005][2],h[100005],g[100005],n;//dp[i][0] 到第i位时所取的最大花朵数,且h[i]>h[i-1]; 
                                        //dp[i][1] 到第i位时所取的最大花朵数,且h[i]<h[i-1];
int main(){
	n=Read();
	for(int i=1;i<=n;++i) h[i]=Read();
	for(int i=1;i<=n;++i) dp[i][1]=dp[i][0]=1;
	for(int i=2;i<=n;++i){
		dp[i][0]=dp[i-1][0];
		dp[i][1]=dp[i-1][1];
		if(h[i]>h[i-1]) dp[i][0]=max(dp[i-1][0],dp[i-1][1]+1);
		if(h[i]<h[i-1]) dp[i][1]=max(dp[i-1][1],dp[i-1][0]+1);
	}
	cout<<max(dp[n][0],dp[n][1])<<endl;
	return 0;
}

华容道:

# include <iostream>
# include <queue>
# include <cmath>
# include <vector>
# include <cstdio>
# include <cstring>
# include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=50;
ll Read()
{
	ll i=0,f=1;char c=getchar();
	while(c>'9'||c<'0') {if(c=='-') f=-1; c=getchar();}
	while(c>='0'&&c<='9') {i=i*10+(c-'0'); c=getchar();}
	return f*i;

}
struct node
{
	int x,y,k,s;
	node(int x,int y,int k,int s) : x(x),y(y),k(k),s(s){}
};
ll n,m,q,ex,ey,sx,sy,tx,ty,ans=-1;
ll Map[maxn][maxn], dis[maxn][maxn][5],move[maxn][maxn][5][5],dep[maxn][maxn];
bool exist[maxn][maxn][5]={false},vis[maxn][maxn]={false};
int turn(int i)
{
	if(i==1) return 2;
	if(i==2) return 1;
	if(i==3) return 4;
	if(i==4) return 3;
}
node go(node p,int i){
	node t=p;
	if(i==1) t.x--;
	if(i==2) t.x++;
	if(i==3) t.y--;
	if(i==4) t.y++;
	return t;
}

inline int BFS(node s,node t)
{
	memset(vis,false,sizeof(vis));
	if(s.x==t.x&&s.y==t.y) return 0;
	int all=1e6+7,tot=0;
	s.s=1;vis[s.x][s.y]=true;
	queue<node >Q;Q.push(s);
	while(!Q.empty())
	{
		node p=Q.front();
		Q.pop();
		for(int i=1;i<=4;++i)
		{
			node now=go(p,i);
			if(now.x>0&&now.x<=n&&now.y>0&&now.y<=m&&!vis[now.x][now.y]&&Map[now.x][now.y])
			{
		        if(now.x==t.x&&now.y==t.y) all=min(now.s,all);
		        else ++now.s,vis[now.x][now.y]=true,Q.push(now);
		    }
		}
	}
	return all;
}
inline void initial()
{
	memset(move,1e6+7,sizeof(move));
	for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
        {
        	if(!Map[i][j]) continue;
        	Map[i][j]=0;
        	for(int k=1;k<=4;++k)
                for(int l=1;l<=4;++l)
                {
                    node s=go(node(i,j,0,1),k);node t=go(node(i,j,0,1),l);
					if(!Map[s.x][s.y]||!Map[t.x][t.y]) continue;
					move[i][j][k][l]=BFS(s,t)+1;
                }
            Map[i][j]=1;
        }
}
int SPFA(node s,node t)
{
	memset(dis,1e6+7,sizeof(dis));
	memset(exist,false,sizeof(exist));
	queue<node >Q;
	if(s.x==t.x&&s.y==t.y) return 0;
	if(Map[s.x][s.y]==0||Map[t.x][t.y]==0) return -1;
	Map[s.x][s.y]=0;
	for(int i=1;i<=4;++i)
	{
		node p=node(s.x,s.y,i,0);
		Q.push(p);exist[p.x][p.y][p.k]=true;
		dis[p.x][p.y][p.k]=BFS(node(ex,ey,0,1),go(s,i));
	}
	Map[s.x][s.y]=1;
	while(!Q.empty())
	{
		node now=Q.front();
		exist[now.x][now.y][now.k]=false;
		Q.pop();
		for(int i=1;i<=4;++i)
		{
			node p=go(now,i);
			p.k=turn(i);
			if(dis[p.x][p.y][p.k]>dis[now.x][now.y][now.k]+move[now.x][now.y][now.k][i])
			{
				dis[p.x][p.y][p.k]=dis[now.x][now.y][now.k]+move[now.x][now.y][now.k][i];
				if(!exist[p.x][p.y][p.k]) Q.push(p), exist[p.x][p.y][p.k]=true;
			}
		} 
	}
	ll ans=1e6+7;
	for(int i=1;i<=4;i++) ans=min(ans,dis[t.x][t.y][i]);
	return ans;
}
int main()
{
	
	n=Read(),m=Read(),q=Read();
	for(int i=1;i<=n;++i)
	    for(int j=1;j<=m;++j)
	        Map[i][j]=Read();
	initial();
	for(int i=1;i<=q;++i)
	{
		ex=Read(),ey=Read(),sx=Read(),sy=Read(),tx=Read(),ty=Read();
		ans=SPFA(node(sx,sy,0,0),node(tx,ty,0,0));
		if(ans==1e6+7) printf("-1\n");
		else printf("%d\n",ans);
	}
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值