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. [原]Django慢请求分析工具--dogslow

    当你的网站突然变慢了,你怎么办? 先看监控,查看系统的资源消耗,CPU?IO?磁盘? 然后看日志,查看第一个出现慢请求的接口是哪个? 然后看依赖的服务,是第三方服务还是DB瓶颈,还是redis变慢,还 ...

  2. 大体了解Lua的语法

    Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱. 在Lua中,一切都是变量,除了关键字.请记住这句话. I. 首先是注释 写一个程序,总是少不了注释的. 在Lua中,你可以使用单行注释和多 ...

  3. B-树

    定义: B-树是一种平衡的多路查找树,在文件系统中有所应用.主要用作文件的索引. 特性:(M为层数) 1.定义任意非叶子结点最多只有M个儿子:且M>2: 2.根结点的儿子数为[2, M]: 3. ...

  4. 常用按键ASCII码

    ESC 27回车 13TAB 9Caps Lock 20Shift $10 Ctrl 17Alt 18空格 VK_SPACE 32退格 VK_BACK 8左徽标 VK_LWIN 91右徽标 VK_RW ...

  5. ajax向前台输出二维数组 并解析

    最近在弄一个售后数据统计的功能,里边需要统计特定时期内各种客户.机型的分布比例,单单table来计算并显示很死板(一点也不酷) 于是决定用jquery插件flot并通过ajax传输数据 :flot的折 ...

  6. 简单翻译和补充:1. GNU ARM Eclipse

    原文链接: GNU ARM Eclipse GNU 介绍: GNU 计划,又称革奴计划,是由RichardStallman在1983年9月27日公开发起的.它的目标是创建一套完全自由的操作系统.Ric ...

  7. 九度oj 1407 快速找出最小数

    原题链接:http://ac.jobdu.com/problem.php?pid=1407 线段树,区间更新,查询区间最小值. 注意区间更新,查询的时候,区间$\begin{align*}[L,R] ...

  8. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  9. Qt的QTabelWidget

    QTableWidget的用法总结  http://blog.csdn.net/zb872676223/article/details/39959061 [Qt]在QTableWidget中添加QCh ...

  10. wire与reg的区别?转载大神!

    本文转自:http://www.cnblogs.com/thymon/archive/2010/06/09/1754541.html //------------------------------- ...