2011 Asia Fuzhou Regional Contest
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 ;
}
2011 Asia Fuzhou Regional Contest的更多相关文章
- 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 ...
- 2010 Asia Fuzhou Regional Contest
A hard Aoshu Problem http://acm.hdu.edu.cn/showproblem.php?pid=3699 用深搜写排列,除法要注意,还有不能有前导零.当然可以5个for, ...
- hdu 4081 Qin Shi Huang's National Road System(最小生成树+dp)2011 Asia Beijing Regional Contest
同样是看别人题解才明白的 题目大意—— 话说秦始皇统一六国之后,打算修路.他要用n-1条路,将n个城市连接起来,并且使这n-1条路的距离之和最短.最小生成树是不是?不对,还有呢.接着,一个自称徐福的游 ...
- 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 ...
- 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 ...
- HDU 3697 Selecting courses(贪心+暴力)(2010 Asia Fuzhou Regional Contest)
Description A new Semester is coming and students are troubling for selecting courses. Students ...
- 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 ...
- 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 ...
- HDU - 4054 Hexadecimal View (2011 Asia Dalian Regional Contest)
题意:按要求输出.第一列是表示第几行.每行仅仅能有16个字节的字母,第二列是16进制的ASCII码.第三列大写和小写转换 思路:纯模拟,注意字母的十六进制是2位 #include <iostre ...
随机推荐
- asp.net实现md5加密方法详解
MD5加密简单的说就是把一段明文 通过某种运算方式 求出密文. 例如:明文为:abcdefg 通过一些列运算 得到 密文 7ac66c0f148de9519b8bd264312c4d64 它具有两个特 ...
- API - .addBack()
从jQuery官网上提供的Example来看,这个API的意思是: 1 先圈定一个范围,[A] $( "div.after-addback" ) 2 再用find过滤一出一个更 ...
- 解决dropdownlist postback 在 iphone UIwebview 失效的问题
原因: IPhone UIWebView 的 用户代理 User Agent 在ASP.NET 4.0环境下是不识别的:所以ASP.NET提供了一个默认的,低级的不包括javascript的页面版本 ...
- JAVA里的字符串,String 类简单介绍
http://www.360doc.com/content/14/1107/23/17130779_423471141.shtml
- 正确打印含unicode字符的dict
python中,dict 对象转换为类似为 \UXXXX 的格式:这种格式英文称为 code point,完全看不懂:当然,也可以通过这个网站来转换 http://rishida.net/tools/ ...
- jQuery toggle方法的一个奇怪表现。
function buildTree() { //$('.tree li:has(ul)').addClass('parent_li').find(' > span').attr('title' ...
- 在newegg工作的这两个月
6月11号,接到录用通知后的第二天,来到了Newegg . 作为开发,在本职工作上 1.入职Quick Start: 两周多的入职快速指引,以了解业务,架构为目的. 因为之前一直有用思维导图的习惯,所 ...
- 说说用C语言求根的那些事儿
C语言--求根:计算机只识别0和1,那么问题来了,作为计算工具如何解决数学问题?其实,计算机是死东西,都是程序员用计算机的的思维去加数学公式计算数学题的.听起来好高端的样子,其实啊,也就那么回事儿, ...
- Java 逻辑运算符、位运算符、移位操作符 总结(Java 学习中的小记录)
Java 逻辑运算符.位运算符.移位操作符 总结 作者:王可利(Star·星星) 逻辑运算符,表格如下: 解析逻辑运算符表: 1.与 (&) 特点:两个都为真的时候,结果为真.两个为 ...
- ED/EP系列4《圈存指令》
1. 圈存交易 通过圈存交易,持卡人可将其在银行相应账户上的资金划入电子存折或电子钱包中. 特点: 1)--必须在金融终端上联机进行; 2)--必须提交个人识别码(PIN) 步骤: 1) --终端: ...