Life of xhu

About

后考研时代(一) & HOJ_1404

Feb 23, 2014

  |   #日常   |   #C++   |   #HOJ

考研终于算是过去了。

回想过去的那半年,感觉就和做梦一样,在本科的最后一次考试,我还是没能成功。

但是,我相信这半年我的收获是很大的,这种学习的状态,将会是我一生的财富。

Fight!

~~~~~~~~~~~~我是萌萌的昏割线~~~~~~~~~~~~~

给数组初始化的时候,别用循环了,用memset吧,用循环一个个赋值太Low了,语法为:

#include <memory.h>     //ANSI C
#include <memory>     //C++ 

memset(void *s, int ch, size_t n);  

即把指针s指向的地址的前n个大小的位置赋初值为字符ch,比如以下用法:

bool test[100];
memset(test, true, sizeof(test));     //即把test中所有元素初值都赋为true  

1404:这道题很简单,但是题意太恶心了,我就详细说一下吧,当然,我不觉得别人能看懂。。。

题目的目的就是想方设法帮一个士兵当逃兵,每个输入里有22个数,第一个是士兵个数,第二个是能够回家的士兵数,后面是20张卡牌,从第一张卡牌开始,对这些士兵进行报数,从零开始,每经过一个士兵,数加1,当数到和卡牌相同的数时,当前的这个士兵退出队伍,继续从0开始,剩下的人继续,比如如果第一张牌是3,那么369...这些士兵将退出队伍,如果一次报数完毕,但是人数多于能够回家的人数,那么去掉第一张牌,剩下的士兵用第二张牌按照刚刚的规则继续报数,直到队伍里面刚好剩下能回家的人数为止。

题意理解了之后,编程还是很简单的,但是注意一下,这道题的输出方式和例子里的并不一样。示例输出里,是除了第一个输出,每个输出前都有一个换行,可是题意要求的是每个输出后面都有一个换行,我就这样PE了几次,坑死爹了。。。

代码如下:

#include <iostream>
#include <cstdio>
#include <memory>
using namespace std;

int main(){
    int count = 0, N, X, left, nums[20], pos[60], tmp;
    while(scanf("%d %d", &N, &X) != EOF){
        left = N;
        memset(pos, 1, sizeof(pos));
        for(int i = 0; i < 20; i++) cin >> nums[i];

        for(int i = 0; left > X; i++){
            tmp = 0;
            for(int j = 0; j < N && left > X; j++){
                if(pos[j]) tmp++;
                if(tmp == nums[i]){
                    left--;
                    tmp = 0;
                    pos[j] = 0;
                }
            }
        }

        cout << "Selection #" << ++count << endl;
        tmp = 0;
        for(int i = 0; i < N; i++){
            if(pos[i]){
                if(tmp++ == 0) cout << i + 1;
                else cout << ' ' << i + 1;
            }
        }
        cout << endl << endl;
    }
}