Xiangqi http://acm.hdu.edu.cn/showproblem.php?pid=4121

模拟,用高内聚低耦合的思想来写模拟题还是很好的,提高了函数的可重用性,程序的可读性,正确性,总而言之,写函数麻烦,总比debug麻烦来的好。

 #include<cstdio>
const int M=;
struct point{
int x,y;
}p[M];
char has[M][M],op[M];
bool vis[M][M];
int dx[]={-,,,};
int dy[]={,,-,};
bool insidemap(const point &a){
if(a.x>=&&a.x<=&&a.y>=&&a.y<=) return true;return false;
}
void flag(const point &a){
vis[a.x][a.y]=true;
}
bool had(const point &a){
if(has[a.x][a.y]!='.') return true;return false;
}
void step(point &a,int dir){
a.x+=dx[dir];
a.y+=dy[dir];
}
void solveG(point a){
while(true){
step(a,);
if(!insidemap(a)) return ;
flag(a);
if(had(a)) return ;
}
}
void solveR(const point &b){
for(int i=;i<;i++){
point a=b;
while(true){
step(a,i);
if(!insidemap(a)) break;
flag(a);
if(had(a)) break;
}
}
}
void solveH(const point &b){
for(int i=;i<;i++){
point a=b;
step(a,i);
if(had(a)) continue;
step(a,i);
if(i<){
for(int j=;j<;j++){
point c=a;
step(c,j);
if(insidemap(c)) flag(c);
}
}
else{
for(int j=;j<;j++){
point c=a;
step(c,j);
if(insidemap(c)) flag(c);
}
}
}
}
void solveC(const point &b){
for(int i=;i<;i++){
point a=b;
while(true){
step(a,i);
if(!insidemap(a)||had(a)) break;
}
while(true){
step(a,i);
if(!insidemap(a)) break;
flag(a);
if(had(a)) break;
}
}
}
bool insidehouse(const point &a){
if(a.x>=&&a.x<=&&a.y>=&&a.y<=) return true;return false;
}
bool judge(const point &b){
for(int i=;i<;i++){
point a=b;
step(a,i);
if(insidehouse(a)&&!vis[a.x][a.y]) return false;
}
return true;
}
int main(){
int n;
while(~scanf("%d%d%d",&n,&p[].x,&p[].y),n|p[].x|p[].y){
for(int i=;i<=;i++){
for(int j=;j<=;j++){
has[i][j]='.';
vis[i][j]=false;
}
}
for(int i=;i<=n;i++){
scanf("%s%d%d",op,&p[i].x,&p[i].y);
has[p[i].x][p[i].y]=op[];
}
for(int i=;i<=n;i++){
op[]=has[p[i].x][p[i].y];
if(op[]=='G'){
solveG(p[i]);
}
else if(op[]=='R'){
solveR(p[i]);
}
else if(op[]=='H'){
solveH(p[i]);
}
else{
solveC(p[i]);
}
}
puts(judge(p[])?"YES":"NO");
}
return ;
}

Alice's mooncake shop http://acm.hdu.edu.cn/showproblem.php?pid=4122

订单按顺序来,然后对第一个订单,暴力算,然后记录一下最小的id,第二个就可以从上一个订单时刻往后找,因为前面已经找过了,单调队列的思想。

 #include<cstdio>
#include<cstring>
typedef __int64 LL;
const LL inf=0x3f3f3f3f3f3f3f3fLL;
const int M=;
struct Date {
int year, month, day;
}now;
int days[]= {,,,,,,,,,,,}; //日期函数
class DATE {
public:
int leap(int year) { //判闰年
return (year%==&&year%!=)||year%==;
}
int date2int(Date a) { //日期转天数偏移
int ret=a.year*+(a.year-)/-(a.year-)/+(a.year-)/;
days[]+=leap(a.year);
for(int i=; i<a.month-; ret+=days[i++]);
days[]=;
return ret+a.day;
}
} help;
char yuefen[M][M]={"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov" , "Dec"};
char month[M];
struct IN{
LL time,R;
}in[];
int cost[];
int main(){
int n,m,data,year,H,R;
LL T,S;
now.year=;
now.month=now.day=;
int preday=help.date2int(now);
while(~scanf("%d%d",&n,&m),n|m){
int s=,t=;
for(int i=;i<n;i++){
scanf("%s%d%d%d%I64d",month,&now.day,&now.year,&H,&in[i].R);
for(int j=;j<;j++){
if(!strcmp(yuefen[j],month)){
now.month=j+;
break;
}
}
in[i].time=(help.date2int(now)-preday)*+H+;
}
scanf("%I64d%I64d",&T,&S);
for(int i=;i<=m;i++){
scanf("%d",&cost[i]);
}
LL ans=;
for(int i=;i<n;i++){
int id=;
LL sma=inf;
for(int j=t;j<=in[i].time;j++){
if(j+T<in[i].time) continue;
LL c=(cost[j]+(in[i].time-j)*S)*in[i].R;
if(sma>c){
sma=c;
id=j;
}
}
if(s+T>=in[i].time){
LL c=(cost[s]+(in[i].time-s)*S)*in[i].R;
if(sma>c){
sma=c;
id=s;
}
}
ans+=sma;
s=id;
t=in[i].time;
}
printf("%I64d\n",ans);
}
return ;
}

Bob’s Race http://acm.hdu.edu.cn/showproblem.php?pid=4123

用树上最长路,就是树的直径,然后求出每个点能到最远距离数组,对其rmq预处理,然后单调队列求。

 #include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
const int inf=0x3f3f3f3f;
const int M=;
struct G{
struct E{
int v,w,next;
}e[M<<];
int le,head[M];
void init(){
le=;
mt(head,-);
}
void add(int u,int v,int w){
e[le].v=v;
e[le].w=w;
e[le].next=head[u];
head[u]=le++;
}
}g;
bool vis[M];
int n;
queue<int> q;
void bfs(int s,int dist[]){
for(int i=;i<=n;i++){
dist[i]=inf;
vis[i]=false;
}
vis[s]=true;
dist[s]=;
while(!q.empty()) q.pop();
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=g.head[u];~i;i=g.e[i].next){
int v=g.e[i].v;
if(vis[v]) continue;
vis[v]=true;
dist[v]=dist[u]+g.e[i].w;
q.push(v);
}
}
}
int getfarid(int dist[]){
int res,big=;
for(int i=;i<=n;i++){
if(big<dist[i]){
big=dist[i];
res=i;
}
}
return res;
}
int d1[M],d2[M],a[M];
class Range_Maximum_Query{///区间最值查询离线算法init_o(nlogn),query_o(1)
int LOG[M],dpmax[M][],dpmin[M][];
public:
void init(){///使用类前调用一次即可
LOG[]=-;
for(int i=;i<M;i++){
LOG[i]=LOG[i>>]+;
}
}
void Make_RMQ(int n,int a[]){///传入点的个数,下标1开始
for(int i=;i<=n;i++){
dpmax[i][]=dpmin[i][]=a[i];
}
for(int j=;j<=LOG[n];j++){
for(int i=;i+(<<j)-<=n;i++){
dpmax[i][j]=max(dpmax[i][j-],dpmax[i+(<<(j-))][j-]);
dpmin[i][j]=min(dpmin[i][j-],dpmin[i+(<<(j-))][j-]);
}
}
}
int get_RMQ(int a,int b,bool big){///传入1返回max,传入0返回min
int k=LOG[b-a+];
if(big)
return max(dpmax[a][k],dpmax[b-(<<k)+][k]);
return min(dpmin[a][k],dpmin[b-(<<k)+][k]);
}
}rmq;
int main(){
int m,u,v,w;
rmq.init();
while(~scanf("%d%d",&n,&m),n|m){
g.init();
for(int i=;i<n-;i++){
scanf("%d%d%d",&u,&v,&w);
g.add(u,v,w);
g.add(v,u,w);
}
bfs(,d1);
int ss=getfarid(d1);
bfs(ss,d2);
int tt=getfarid(d2);
bfs(tt,d1);
for(int i=;i<=n;i++){
a[i]=max(d1[i],d2[i]);
}
rmq.Make_RMQ(n,a);
while(m--){
scanf("%d",&w);
int s=,t=,ans=;
while(true){
if(rmq.get_RMQ(s,t,)-rmq.get_RMQ(s,t,)<=w){
ans=max(ans,t-s+);
t++;
}
else{
s++;
}
if(t>n) break;
}
printf("%d\n",ans);
}
}
return ;
}

end

2011 Asia Fuzhou Regional Contest的更多相关文章

  1. HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)

    Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...

  2. 2010 Asia Fuzhou Regional Contest

    A hard Aoshu Problem http://acm.hdu.edu.cn/showproblem.php?pid=3699 用深搜写排列,除法要注意,还有不能有前导零.当然可以5个for, ...

  3. hdu 4081 Qin Shi Huang's National Road System(最小生成树+dp)2011 Asia Beijing Regional Contest

    同样是看别人题解才明白的 题目大意—— 话说秦始皇统一六国之后,打算修路.他要用n-1条路,将n个城市连接起来,并且使这n-1条路的距离之和最短.最小生成树是不是?不对,还有呢.接着,一个自称徐福的游 ...

  4. HDU 4115 Eliminate the Conflict(2-SAT)(2011 Asia ChengDu Regional Contest)

    Problem Description Conflicts are everywhere in the world, from the young to the elderly, from famil ...

  5. HDU 3698 Let the light guide us(DP+线段树)(2010 Asia Fuzhou Regional Contest)

    Description Plain of despair was once an ancient battlefield where those brave spirits had rested in ...

  6. HDU 3697 Selecting courses(贪心+暴力)(2010 Asia Fuzhou Regional Contest)

    Description     A new Semester is coming and students are troubling for selecting courses. Students ...

  7. HDU 3699 A hard Aoshu Problem(暴力枚举)(2010 Asia Fuzhou Regional Contest)

    Description Math Olympiad is called “Aoshu” in China. Aoshu is very popular in elementary schools. N ...

  8. HDU 3696 Farm Game(拓扑+DP)(2010 Asia Fuzhou Regional Contest)

    Description “Farm Game” is one of the most popular games in online community. In the community each ...

  9. HDU - 4054 Hexadecimal View (2011 Asia Dalian Regional Contest)

    题意:按要求输出.第一列是表示第几行.每行仅仅能有16个字节的字母,第二列是16进制的ASCII码.第三列大写和小写转换 思路:纯模拟,注意字母的十六进制是2位 #include <iostre ...

随机推荐

  1. Zend Studio下调试PHP的一点注意事项

    Zend Studio默认php文件的存放路径是你配置的服务器的路径,比如你配置的服务器是localhost,那么,你在zend下建立的文件均是相对于localhost而言的,比如你新建一个php工程 ...

  2. android在程序中打开另一个程序

    在开发android应用的时候,在一些情况下要有前置条件,比如这边所说的要启动时要确保别的应用程序服务已经打开  或者在操作中启动别的应用等. 先来一段google上的代码: 1. 已知包名和类名的情 ...

  3. xtrabackup之Innobackupex全备恢复

    一.当前环境 [mysql@hadoop1 ~]$ mysql --defaults-/my.cnf -uroot -p123456 -P3306 mysql> show variables l ...

  4. 自学Python二 Python中的屠龙刀(续)

    函数 秉承着一切皆对象的理念,函数作为对象,可以为其赋值新的对象名,也可以作为参数传递给其他函数! 正常的诸如空函数,默认参数等等我们就不提了,在这里着重提一下默认参数里面的坑和lambda函数. 当 ...

  5. hdu 5210 Delete

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5210 简单题如下: #include<algorithm> #include<ios ...

  6. OpenStack:安装Keystone

    >安装Keystone1. 安装# apt-get install keystone2. 创建dbcreate database keystone;grant all privileges on ...

  7. libcurl 安装使用一

    一.下载libcurl http://curl.haxx.se/download/curl-7.21.1.tar.gz 二.安装   指定了安装目录     /usr/local/curl 命令1: ...

  8. [转]编译错误: /bin/sh: 1: pushd: not found的问题

    [转]编译错误: /bin/sh: 1: pushd: not found的问题 http://blog.csdn.net/ojinxi/article/details/12186839 ubuntu ...

  9. sharepoint 2010 切换域

    前提: 现在已经有一个sharepoint 2010的环境,当前域为contosoA.com,有个需求需要将这个域切换到域contosoB.com.下面是成功操作的步骤. 1.数据最重要 备份所有数据 ...

  10. linux 简单的DMA例程

    一个简单的使用DMA 例子 示例:下面是一个简单的使用DMA进行传输的驱动程序,它是一个假想的设备,只列出DMA相关的部分来说明驱动程序中如何使用DMA的. 函数dad_transfer是设置DMA对 ...