chenchen题解:NOIP2010-J

下面是NOIP2010普及组初赛错题整理

X、Y、Z 分别代表三进制下的一位数字,若等式 XY+ZX=XYX在三进制下成立,那么同样在三进制下,等式XY*ZX=

解释:
最低位,Y + X = X,则Y必为0在这里插入代码片
最高位,X + Z = XY,则Z = 2, X = 1
所以:XY * ZX = 10 * 21 = 210 = ZXY

前缀表达式“+3*2+5 12”的值是( )

解释:
前缀表达式的计算机求值:
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
本题中,先将12和5先后入栈;碰到+,将5和12依次弹出,计算5 + 12 = 17,将17入栈;将2入栈;碰到*,将2和17依次弹出栈,计算2 * 17 = 34,将34入栈;将3入栈;碰到+,将3和34依次弹出栈,计算3 + 34 = 37

一个自然数在十进制下有 nn 位,则它在二进制下的位数与( )最接近。

解释:
10 ∗ l o g 2   n 10*log_2~n 10log2 n
这题可以举个特例n = 3。三位数的最小值为100,最大值为999
100 = 1100100,这是七位二进制。
999 < 1024 = 210 = 10000000000(B), 1024是十一位二进制,则999是十位二进制。
再看四个答案,5n = 15, nlog(10) = 8.x, 10log(n) > 10, 10nlog(n) > 1000。
所以是: 10 ∗ l o g 2   n 10*log_2~n 10log2 n

chenchen题解:NOIP2010-J_第1张图片

解释:
选D,D选项中,p->rlink->llink = p->rlink;表示RightNode的左指针指向了RightNode本身,错误。
如图:在这里插入图片描述

队列快照是指在某一时刻队列中的元素组成的有序序列。例如,当元素 1、2、3 入队,元素 1出队后,此刻的队列快照是“2 33”。当元素 2、3 也出队后,队列快照是“”,即为空。现有 3 个正整数元素依次入队、出队。已知它们的和为 88,则共有____种可能的不同的队列快照(不同队列的相同快照只计一次)。例如,“5 1”、“4 2 2”、“”都是可能的队列快照:而“7”不是可能的队列快照,因为剩下的 2 个正整数的和不可能是 1。

解释:
我的理解是这样的,
第一个是“”,一位数一共有6个
然后两位数
1 1 到 1 6 共6个
2 1到 2 5 共5个
3 1到 3 4 共4个
4 1 到4 3共3个
5 1到 5 2 共2个
6 1到 6 1 共1个
总共1+2+····+6=21个
最后三位数
1开头 116 125 134 143 152 161
2开头 215 224 233 242 251
同理可得 总共 6+5+···+1=21
所以全部加起来总共1+6+21+21=49个

(过河问题) 在一个月黑风高的夜晚,有一群人在河的右岸,想通过唯一的一根独木桥走到河的左岸。在伸手不见五指的黑夜里,过桥时必须借照灯光来照明,不幸的是,他们只有一盏灯。另外,独木桥上最多能承受两个人同时经过,否则将会坍塌。每个人单独过独木桥都需要一定的时间,不同的人要的时间可能不同。两个人一起过独木桥时,由于只有一盏灯,所以需要的时间是较慢的那个人单独过桥所花费的时间。现在输入 N 和这 N 个人单独过桥需要的时间,计算总共最少需要多少时间,他们才能全部到达河左岸。
例如,有 3个人甲、乙、丙,他们单独过桥的时间分别为11、2、4,则总共最少需要的时间为 7。具体方法是:甲、乙一起过桥到河的左岸,甲单独回到河的右岸将灯带回,然后甲,丙在一起过桥到河的左岸,总时间为 2+1+4=7。

#include
#include
using namespace std;
const int SIZE=100;
const int INFINITY = 10000;
const bool LEFT=true;
const bool RIGHT =false;
const bool LEFT_TO_RIGHT=true;
const bool RIGHT_TO_LEFT=false;
int n,hour[SIZE];
bool pos[SIZE];
int max(int a,int b)
{
    if(a>b)
       return a;
    else
       return b;
}
int go(bool stage)
{
    int i,j,num,tmp,ans;
    if(stage==RIGHT_TO_LEFT)
    {
        num=0;
        ans=0;
        for(i=1;i<=n;i++)
           if(pos[i]==RIGHT)
           {
               num++;
               if( hour[i]>ans)
                   ans=hour[i];
           }
        if()
            return ans;
        ans=INFINITY;
        for(i=1;i<=n-1;i++)
           if(pos[i]==RIGHT)
               for(j=i+1;j<=n;j++)
                  if(pos[j]==RIGHT)
                  {
                      pos[i]=LEFT;
                      pos[j]=LEFT;
                      tmp=max(hour[i],hour[j])+;
                      if(tmp<ans)
                         ans=tmp;
                      pos[i]=RIGHT;
                      pos[j]=RIGHT;
                  }
        return ans;
    }
    if(stage==LEFT_TO_RIGHT)
    {
        ans=INFINITY;
        for(i=1;i<=n;i++)
            if()
            {
                pos[i]=RIGHT;
                tmp=;
                if(tmp<ans)
                    ans=tmp;;
            }
        return ans;
    }
    return 0;
}
int main()
{
    int i;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>hour[i];
        pos[i]=RIGHT;
    }
    cout<<go(RIGHT_TO_LEFT)<<endl;
    return 0;
}

①如果没过来的只有一个,直接过来就可以了
②递归到下一层继续搜
③判断是否还在左边
④更新时间是右到左的时间
⑤过去了就更新位置LEFT

你可能感兴趣的:(chenchen题解:NOIP2010-J)