1 1 、传教士 (bishop)

问题描述:
panzhili 王国的疆土恰好是一个矩形,为了管理方便,国王 jjs 将整个疆土划分成 N*
M 块大小相同的区域。由于 jjs 希望他的子民也能信教爱教(”打拳”神教) ,所以他想安排一
些传教士到全国各地去传教。 但这些传教士的传教形式非常怪异, 他们只在自己据点周围特
定的区域内传教且领地意识极其强烈 (即任意一个传教士的据点都不能在其他传教士的传教
区域内,否则就会发生冲突) 。现在我们知道传教士的传教区域为以其据点为中心的两条斜
对角线上(如图) 。现在 jjs 请你帮忙找出一个合理的安置方案,使得可以在全国范围内安
置尽可能多的传教士而又不至于任意两个传教士会发生冲突。
X
X X
A
X X
(若 A 为某传教士的据点,则其传教范围为所有标有 X 的格子。为不产生冲突,则第
二个传教士的据点只能放在上图的空格中。 )
输入数据
输入文件共一行,包含两个整数 N 和 M,代表国土的大小,n 为水平区域数,m 为垂
直区域数。
输出数据
输出文件仅一行,包含一个整数,即最多可以安置的传教士的数目。
样例输入 样例输入 bishop.in
3 4
样例输出 样例输出 bishop.out
6
说明:样例安置方案如下图所示,X 表示为某传教士的据点。
XXX
OOO
OOO
XXX
对于 100%的数据,1<=n,m<=9,且数据规模呈梯度上升。

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,ans;
bool v1[],v2[];
void dfs(int x,int y,int sum){
ans=max(ans,sum);
if(y>m||x>n)return;
if(!v1[x-y+]&&!v2[x+y]){
v1[x-y+]=;
v2[x+y]=;
if(y==m)dfs(x+,,sum+);
else dfs(x,y+,sum+);
v1[x-y+]=;
v2[x+y]=;
}
if(y==m)dfs(x+,,sum);
else dfs(x,y+,sum);
}
int main(){
freopen("bishop.in","r",stdin);
freopen("bishop.out","w",stdout);
scanf("%d%d",&n,&m);
dfs(,,);
printf("%d",ans);
}

70分 暴力

/*
表打出来就很容易看出结论 1 2 3 4 5 6 7
2 2 4 4 6 6 8
3 4 4 6 7 8 9
4 4 6 6 8 8 10
5 6 7 8 8 10 11
6 6 8 8 10 10 12
7 8 9 10 11 12 12 奇偶列分类,然后n=m特判
*/
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,ans;
int main(){
freopen("bishop.in","r",stdin);
freopen("bishop.out","w",stdout);
scanf("%d%d",&n,&m);
if(n==&&m==){puts("");return ;}
if(n>m)swap(n,m);
if(n&){
ans=n+m-;
if(n==m)ans--;
}
else ans=n+(m-)/*;
printf("%d",ans);
return ;
}

100分 打表找规律

2 、czy 把妹(czybm)

Czy 是个大丧失,非常喜欢 bm。他经常挑战 bm 的极限,同时 b 很多的 mz。(虽然也
许质量不容乐观)
这一天,czy 又开始了他的极限挑战。在一个数轴上有 n 个 maze,她们都在等待着
czy 的到来。Czy 一开始站在 k 号妹子的旁边,他需要搞定所有的妹子(由于他向 fewdan
学会了绝技,所以搞定妹子的时间是无限接近于 0 的,也就是一瞬间就搞定而不用花额外
的时间)。 Maze 们都很没有耐心, 每让她们多等 1s,她们就会增加 w[i]的不开心值。 现在,
czy 从 k 号妹子这里出发,以 1m/s 的速度开始行动,他希望在搞定所有 maze 的情况下使
得她们的不开心值总和最小,于是他找到了即将在 NOIP2014 AK 的你来帮他解决这个问
题。
文件输入:
输入文件的第一行包含一个整数 N,2<=N<=1000,表示 maze 的数量。
第二行包含一个整数 V,1<=V<=N,表示开始时 czy 站在几号 maze 的旁边.接下来的 N 行
中,每行包含两个用空格隔开的整数 D 和 W,用来描述每个 maze,其中 0<=D<=1000,
0<=W<=1000。D 表示 MM 在数轴上的位置(单位: m),W 表示每秒钟会增加的不开心值。
文件输出:
一个整数,最小的不开心值。(答案不超过 10^9)
样例输入
4
3
2 2
5 8
6 1
8 7
样例输出
56
对于 40%的数据,1<=n<=7
对于 100%的数据,1<=n<=1000 0<=D<=1000 0<=w<=1000

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
#define maxn 1010
int n,dis[maxn][maxn],s;
long long ans=0x7fffffff;
bool vis[maxn];
struct node{
int pos,w;
}q[maxn];
void dfs(int now,int cnt,long long sum,int tim){
if(sum>=ans)return;
if(cnt==n){
if(sum<)return;
ans=min(ans,sum);
return;
}
for(int i=;i<=n;i++){//下一个要把的妹
if(!vis[i]){
vis[i]=;
dfs(i,cnt+,sum+q[i].w*(tim+dis[i][now]),tim+dis[i][now]);
vis[i]=;
}
}
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("czybm.in","r",stdin);
freopen("czybm.out","w",stdout);
scanf("%d%d",&n,&s);
vis[s]=;
for(int i=;i<=n;i++)
scanf("%d%d",&q[i].pos,&q[i].w);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dis[i][j]=abs(q[i].pos-q[j].pos);
dfs(s,,,);
cout<<ans;
return ;
}

40分 暴力

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int n,v,rp[],x[],sum[],l[][],r[][];
int main(){
freopen("czybm.in","r",stdin);
freopen("czybm.out","w",stdout);
int i,j,L;
scanf("%d%d",&n,&v);
for(i=;i<=n;i++) scanf("%d%d",&x[i],&rp[i]);
for(i=;i<=n;i++) sum[i]=sum[i-]+rp[i];
for(i=;i<=n;i++) r[i][i]=l[i][i]=abs(x[i]-x[v])*sum[n];
for(L=;L<=n;L++){
for(i=;i<=n;i++){
j=i+L-; if(j>n) break;
l[i][j]=l[i+][j]+(x[i+]-x[i])*(sum[i]+sum[n]-sum[j]);
l[i][j]=min(l[i][j],r[i][j-]+(x[j]-x[j-])*(sum[i-]+sum[n]-sum[j-])+(x[j]-x[i])*(sum[n]-sum[j]+sum[i-]));
r[i][j]=r[i][j-]+(x[j]-x[j-])*(sum[i-]+sum[n]-sum[j-]);
r[i][j]=min(r[i][j],l[i+][j]+(x[i+]-x[i])*(sum[i]+sum[n]-sum[j])+(x[j]-x[i])*(sum[i-]+sum[n]-sum[j]));
}
}
printf("%d\n",min(l[][n],r[][n]));
return ;
}

100分 dp

3、hzwer的跳跳棋(hop)

【问题描述】

Hzwer的跳跳棋是在一条数轴上进行的。棋子只能摆在整点上。每个点不能摆超过一个棋子。

某一天,黄金大神和cjy用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置。他们要通过最少的跳动把它们的位置移动成x,y,z。(棋子是没有区别的)

跳动的规则很简单,任意选一颗棋子,对一颗中轴棋子跳动。跳动后两颗棋子距离不变。一次只允许跳过1颗棋子。

写一个程序,首先判断是否可以完成任务。如果可以,输出最少需要的跳动次数。

【输入格式】

第一行包含三个整数,表示当前棋子的位置a b c。(互不相同)

第二行包含三个整数,表示目标位置x y z。(互不相同)

【输出格式】

如果无解,输出一行NO。

如果可以到达,第一行输出YES,第二行输出最少步数。

【样例输入】

1 2 3

0 3 5

【样例输出】

YES

2

【范围】

20% 输入整数的绝对值均不超过10

40% 输入整数的绝对值均不超过10000

100% 绝对值不超过10^9

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
#define mod1 23333333
#define mod2 45975231
int s1,s2,s3,t1,t2,t3;
bool vis[];
struct node{
int a,b,c,step;
}cur,nxt;
int hash(int a,int b,int c){
int a1=1LL*(a+)*%mod2;
int a2=1LL*(b+)*%mod2;
int a3=1LL*(c+)*%mod2;
int res=(1LL*a1*a2%mod1)*a3%mod1;
return res;
}
queue<node>q;
void push(int a,int b,int c,int step){
node now;
now.a=a;now.b=b;now.c=c;now.step=step;
q.push(now);
vis[hash(a,b,c)]=;
vis[hash(a,c,b)]=;
vis[hash(b,a,c)]=;
vis[hash(b,c,a)]=;
vis[hash(c,a,b)]=;
vis[hash(c,b,a)]=;
}
bool pan(int a,int b,int c){
if(a==t1&&b==t2&&c==t3)return ;
if(a==t1&&b==t3&&c==t2)return ;
if(a==t2&&b==t1&&c==t3)return ;
if(a==t2&&b==t3&&c==t1)return ;
if(a==t3&&b==t1&&c==t2)return ;
if(a==t3&&b==t2&&c==t1)return ;
return ;
}
int z[];
int bfs(){
while(!q.empty()){
node now=q.front();q.pop();
int s=now.step;
z[]=now.a,z[]=now.b,z[]=now.c;
sort(z+,z+);
int a,b,c;
int dis; a=z[],b=z[]-(z[]-z[]),c=z[];
if(pan(a,b,c))return s+;
if(!vis[hash(a,b,c)])push(a,b,c,s+); a=z[],b=z[]+(z[]-z[]),c=z[];
if(pan(a,b,c))return s+;
if(!vis[hash(a,b,c)])push(a,b,c,s+); if(z[]-z[]>z[]-z[]){
a=z[],b=z[]-(z[]-z[]),c=z[];
if(pan(a,b,c))return s+;
if(!vis[hash(a,b,c)])push(a,b,c,s+);
}
if(z[]-z[]<z[]-z[]){
a=z[],b=z[]+(z[]-z[]),c=z[];
if(pan(a,b,c))return s+;
if(!vis[hash(a,b,c)])push(a,b,c,s+);
}
}
return -;
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("hop.in","r",stdin);
freopen("hop.out","w",stdout);
scanf("%d%d%d%d%d%d",&s1,&s2,&s3,&t1,&t2,&t3);
push(s1,s2,s3,);
int ans=bfs();
if(ans==-){
printf("NO");return ;
}
else {
printf("YES\n%d",ans);
return ;
}
}

15分 暴力

/*
对于一个状态,中间的一个棋子可以往两边跳,而两边的棋子最多只有一个可以往中间跳
故每个状态看做一个点,有关连的状态连起来,就形成了一棵二叉树
对于一个某个有解的状态而言,中间往两边跳的两个状态是它的儿子,两边往中间跳的状态是它的父亲
于是就变成了树上两点求距离问题。
暴力只有40分
若记前两个数差t1,后两个数差t2,不妨设t1<t2则左边最多往中间跳(t2-1)/t1次然后只能右边往中间跳,是一个辗转相除的过程,即在logK的时间内我们可以用这种方法得到某个结点它向上K次后的结点,或者根节点,同时还可以顺便算下深度
于是就变成了先把两个节点调到树上同一深度再二分LCA的深度即可
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int INF=(int)1e9;
struct data{
int a[];
bool operator != (const data b){
return (a[]!=b.a[]||a[]!=b.a[]||a[]!=b.a[]);
}
};
int t1,t2,tmp,ans;
int a[],b[]; data calc(int *a,int k){
data res;
int t1=a[]-a[],t2=a[]-a[],t;
for(int i=;i<;i++)res.a[i]=a[i];
if(t1==t2)return res;
if(t1<t2){
t=min(k,(t2-)/t1);
k-=t,tmp+=t;
res.a[]+=t*t1,res.a[]+=t*t1;
}
else {
t=min(k,(t1-)/t2);
k-=t,tmp+=t;
res.a[]-=t*t2,res.a[]-=t*t2;
}
return k?calc(res.a,k):res;
} int main(){
freopen("hop.in","r",stdin);
freopen("hop.out","w",stdout);
int d1,d2;
data t1,t2;
for(int i=;i<;i++)scanf("%d",&a[i]);
for(int i=;i<;i++)scanf("%d",&b[i]);
sort(a+,a+);
sort(b+,b+);
t1=calc(a,INF),d1=tmp,tmp=;
t2=calc(b,INF),d2=tmp,tmp=;
if(t1!=t2){
printf("NO");
return ;
}
if(d1>d2){
swap(d1,d2);
for(int i=;i<;i++)swap(a[i],b[i]);
}
ans=d2-d1;
t1=calc(b,ans);
for(int i=;i<;i++)b[i]=t1.a[i];
int l=,r=d1,mid;
while(l<=r){
mid=l+r>>;
if(calc(a,mid)!=calc(b,mid))l=mid+;
else r=mid-;
}
printf("YES\n%d",ans+*l);
return ;
}

100分 lca+二分

2014-10-22 NOIP模拟赛的更多相关文章

  1. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  2. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  3. 2018.9.22 NOIP模拟赛

    *注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A 妹子 Problem B 旅程 Problem C 老大 因为业务水平下滑太严重,去和高一考NOIP模拟,sad... P ...

  4. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  5. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  6. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  7. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  8. 2018.10.03 NOIP+ 模拟赛 解题报告

    得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...

  9. 2018.10.30 NOIp模拟赛 T1 改造二叉树

    [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...

  10. 18.9.22 noip模拟赛

    此题为找规律.期望100 实际100 #include<cstdio> #include<cstring> #include<iostream> #include& ...

随机推荐

  1. Java for LeetCode 081 Search in Rotated Sorted Array II

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...

  2. Java for LeetCode 096 Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  3. ubuntu删除文件夹

    -r表示强制删除,-f表示不提示 强制删除文件夹并提示 sudo rm -r 文件夹名 强制删除文件夹不提示 (最暴力) sudo rm -rf 文件夹名

  4. JVM 什么时候会full gc

    除直接调用System.gc外,触发Full GC执行的情况有如下四种.1. 旧生代空间不足旧生代空间只有在新生代对象转入及创建为大对象.大数组时才会出现不足的现象,当执行Full GC后空间仍然不足 ...

  5. Delphi-WebService(53)

    Delphi-WebService(53) http://blog.csdn.net/qq56430204/article/details/4875770 Delphi Web Services程序

  6. Css公共文件结构

    一般一个网站会有这么三个样式: global.css | reset.css(格式化样式) common.css(公共组件样式) layout.css(当前页面样式) 清除全站所有页面的浏览器默认样式 ...

  7. listen and translation exercise 51

    You are supposed to be having fun now. I have to hand in my biology paper tomorrow. Listen, you litt ...

  8. Unity 摄像机旋转初探

    接触打飞机的游戏时都会碰见把摄像机绕 x 轴顺时针旋转 90°形成俯瞰的视角的去看飞船.也没有多想,就感觉是坐标系绕 x 轴旋转 90°完事了.但是昨天用手比划发一下发现不对.我就想这样的话绕 x 轴 ...

  9. BZOJ-4327:JSOI2012 玄武密码(AC自动机模板题)

    在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此.  很多年后,人们终于在进香 ...

  10. springMVC源代码阅读之servlet部分<一>servlet部分详解

    [一]servlet的概念