2014-10-4 NOIP模拟赛

1、某种密码(password.*)

关于某种密码有如下描述:某种密码的原文A是由N个数字组成,而密文B是一个长度为N的01数串,原文和密文的关联在于一个钥匙码KEY。若KEY=∑?〖Ai*Bi〗,则密文就是原文的一组合法密码。

现在有原文和钥匙码,请编一个程序来帮助他统计到底有多少个符合条件的密文。

【输入数据】

第一行两个数N,KEY,意义同题目描述;

第二行N个数表示原文A,意义同题目描述。

【输出数据】

一个数ANS,表示对于原文A和KEY,有多少组可行的密文B。

【输入样例】

3 2

1 1 2

【输出样例】

2

【样例说明】

密文110,1*1+1*1+0*2=2

密文001,0*1+0*1+1*2=2

一共两组可行的密文。

【数据约定】

60%数据满足N<=25

100%数据满足N<=40,-maxlongint<=∑?Ai<=maxlongint

/*
    设了long long类型的变量,用“%lld”怎么也读不进去,必须用cin或者qread
*/
#include<iostream>
#include<cstdio>
using namespace std;
int n;
long long a[50],key;
long long qread(){
    long long i=0;
    int j=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)j=-1;ch=getchar();}
    while(ch<=‘9‘&&ch>=‘0‘){i=i*10+ch-‘0‘;ch=getchar();}
    return i*j;
}
long long dfs(int pos,long long sum){
    if(pos==n+1){
        if(sum==key)return 1;
        return 0;
    }
    long long ans=0;
    ans+=dfs(pos+1,sum+a[pos]);
    ans+=dfs(pos+1,sum);
    return ans;
}
int main(){
    //freopen("Cola.txt","r",stdin);
    freopen("password.in","r",stdin);
    freopen("password.out","w",stdout);
    scanf("%d",&n);
    key=qread();
    for(int i=1;i<=n;i++)a[i]=qread();
    cout<<dfs(1,0);
}

60分 暴力

2、球的序列(formation.*)

N个编号为1-n的球,每个球都有唯一的编号。这些球被排成两种序列,分别为A、B序列,现在需要重新寻找一个球的序列l,对于这个子序列l中任意的两个球,要求j,k(j<k),都要求满足lj在A中位置比lk在A中位置靠前,却lj在B中位置比lk在B中位置靠前,请你计算这个子序列l的最大长度。

输入:

第一行一个整数,表示N。

第二行N个整数,表示A序列。

第三行N个整数,表示B序列。

样例输入

5

1 2 4 3 5

5 2 3 4 1

样例输出

2

样例说明

L可以是{2,3},也可以是{2,4}

数据范围:

40% N<=5000

100% N<=50000

#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 50010
int n,a[maxn],b[maxn],c[maxn],f[maxn],dp[maxn];
int main(){
    freopen("Cola.txt","r",stdin);
    //freopen("formation.in","r",stdin);
    //freopen("formation.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        c[a[i]]=i;
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&b[i]);
        f[i]=c[b[i]];dp[i]=1;
    }
    int ans=1;
    for(int i=2;i<=n;i++)
        for(int j=1;j<i;j++)
            if(f[i]>f[j]){
                dp[i]=max(dp[i],dp[j]+1);
                ans=max(ans,dp[i]);
            }
    cout<<ans;
}

60分 最长上升子序列

3、大逃亡(escape.*)

给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上,矩形的行号从0到X-1,列号从0到Y-1再给出四个数字x1,y1,x2,y2,代表你要从点(x1,y1)移到(x2,y2)。在移动的过程中你当然希望离敌人的距离的最小值最大化,现在请求出这个值最大可以为多少,以及在这个前提下,你最少要走多少步才可以回到目标点。注意这里距离的定义为两点的曼哈顿距离,即某两个点的坐标分为(a,b),(c,d),那么它们的距离为|a-c|+|b-d|。

输入:

第一行给出数字N,X,Y

第二行给出x1,y1,x2,y2

下面将有N行,给出N个敌人所在的坐标

输出:

在一行内输出你离敌人的距离及在这个距离的限制下,你回到目标点最少要移动多少步。

Sample input

2 5 6

0 0 4 0

2 1

2 3

Sample output

2 14

/*
    先暴力预处理出每个点离最近的敌人的距离(这个预处理真的特别暴力)
    二分答案,在check每个答案的时候顺便记录下这种答案下的最短路,以为check的方法是灌水,所以不费事
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define maxn 1010
int N,n,m,x1,x2,ans1,y1,y2,d[maxn][maxn],ans2,now,len;
bool flag,vis[maxn][maxn];//check中要用的
struct node{
    int x,y,step;
}cur,nxt;
int e[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int abs(int x){
    if(x<0)return -x;
    return x;
}
bool bfs(int limit){
    queue<node>q;
    cur.x=x1;cur.y=y1;cur.step=0;
    q.push(cur);
    while(!q.empty()){
        cur=q.front();q.pop();vis[cur.x][cur.y]=0;
        for(int i=0;i<4;i++){
            int xx=cur.x+e[i][0],yy=cur.y+e[i][1];
            if(xx<n&&xx>=0&&yy<m&&yy>=0&&d[xx][yy]>=limit&&!vis[xx][yy]){
                nxt.x=xx;nxt.y=yy;nxt.step=cur.step+1;
                if(xx==x2&&yy==y2){
                    len=nxt.step;
                    return 1;
                }
                q.push(nxt);
                vis[xx][yy]=1;
            }
        }
    }
    return 0;
}
bool check(int x){
    flag=0;
    memset(vis,0,sizeof(vis));
    if(bfs(x)){
        ans2=len;
        return 1;
    }
    return 0;
}
int main(){
    //freopen("Cola.txt","r",stdin);
    freopen("escape.in","r",stdin);
    freopen("escape.out","w",stdout);
    memset(d,127/3,sizeof(d));
    scanf("%d%d%d",&N,&n,&m);
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    int x,y;
    int l=0x7fffffff,r=0;
    for(int i=1;i<=N;i++){
        scanf("%d%d",&x,&y);
        d[x][y]=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                d[i][j]=min(d[i][j],abs(i-x)+abs(j-y));
    }
    for(int i=0;i<n;i++)for(int j=0;j<m;j++)r=max(r,d[i][j]),l=min(l,d[i][j]);
    r=min(r,min(d[x1][y1],d[x2][y2]));
    while(l<=r){
        now=(l+r)>>1;
        if(check(now))ans1=now,l=now+1;
        else r=now-1;
    }
    printf("%d %d",ans1,ans2);
}

55分 暴力

时间: 2024-10-29 19:12:04

2014-10-4 NOIP模拟赛的相关文章

2016.10.30 NOIP模拟赛 day2 PM 整理

满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经被覆盖了,我的做法是递归去推出它现在在哪个位置,不仅超时,而且答案错误. 也曾想过用数组去存下它当前的位置,但是被10^18的数据吓到了. 正解:并不是所有的坐标都有用,仅仅是那m个将要用到的点有用,所以每次折叠,就只对之后的有用的k个点进行更新,这样就行了. 时间复杂度O(m^2) 不会超时的.

2016.10.29 NOIP模拟赛 PM 考试整理

300分的题,只得了第三题的100分. 题目+数据:链接:http://pan.baidu.com/s/1o7P4YXs 密码:4how T1:这道题真的是跪在游戏玩少了. 我忽视了游戏中的两个常识:1.开始的序列是无法消除的(这与题目描述明显不符啊),即使有很多可以连消的,而我的程序每次只在插入的位置向两侧寻找可以消除的,自然就错了. 2.开始时的序列居然可以为空,真是让人措手不及! 正确做法:用指针链表,而且不可以用数组模拟.

2016.10.30 NOIP模拟赛 day2 AM 整理

题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高,但是比较满意,因为把自己会的分数都拿到了. T1:100分 1 /* 2 T1明显是个数论题. 3 正确的思路:把n!质因数分解,把所有质因数的指数都取到最大的偶数,它们的乘积便是最终的结果. 4 有一种很快的方法在Eular筛中可以n!的质因数分解. 5 if(!is_prim[i]) 6 { 7

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人

2012-10-20 NOIP模拟赛

      2012-10-20 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas exploit.cpp/c/pas 输入文件 type.in num.in exploit.in 输出文件 type.out num.out exploit.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 256MB 256MB 测试点 5+(5) 10

【noip模拟赛4】Matrix67的派对 暴力dfs

[noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排在圆桌上.Matrix67的安排原则是,圆桌上任意两个相邻人的身高之差不能超过K.请告诉Matrix67他共有多少种安排方法. 输入 第一行输入两个用空格隔开的数N和K,其中1<=N<=10,1<=K<=1 000 000. 第二行到第N+1行每行输入一个人的身高值.所有人的身高都是不

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻

NOIP模拟赛

#1[Nescafé 31]杯NOIP模拟赛 t1 题意:n*m的棋盘上从(1,1)走到(n,m),只能向下或向右,一些格子有老鼠,每个老鼠互不相同,当处于与老鼠有重边的格子时,视为看见了这只老鼠,求到终点看到最少的不同老鼠数. 分析:DP 由于求得是看到的不同的老鼠数目,不能直接用过河卒做,因为同一个位置的老鼠可能会统计多次,我们还需要增加一维即方向. f[i,j,0]表示到从上面一个格子走到(i,j)时最少老鼠数,f[i,j,1]表示左边. f[i,j,0]:=min(f[i-1,j,0]+