考研终于算是过去了。
回想过去的那半年,感觉就和做梦一样,在本科的最后一次考试,我还是没能成功。
但是,我相信这半年我的收获是很大的,这种学习的状态,将会是我一生的财富。
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
,那么3
、6
、9
...这些士兵将退出队伍,如果一次报数完毕,但是人数多于能够回家的人数,那么去掉第一张牌,剩下的士兵用第二张牌按照刚刚的规则继续报数,直到队伍里面刚好剩下能回家的人数为止。
题意理解了之后,编程还是很简单的,但是注意一下,这道题的输出方式和例子里的并不一样。示例输出里,是除了第一个输出,每个输出前都有一个换行,可是题意要求的是每个输出后面都有一个换行,我就这样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;
}
}