山大华特卧龙学校第一届ACM赛后总结

题目_A

题目描述

孔子学院最近招收了 个学员,并要求他们按照《大学》里说的进行修行:格物,致知,诚意,正心,修身,齐
家,治国,平天下。由于输入限制,用全拼表示相应的修行。
如果有学生达到了相应的修为,他就会报告他的老师。但是有的同学有可能会在报告中说谎,具体来说有以下两种
情况:
1、上一级修为尚未达成,就报告说自己达到了这一级修为。比如说,还没有“格物”,就报告说已经达到“致知”。
2、报告格式不是相应修为的全拼。
现在你的任务是,对于给定的 条报告信息,输出每一个同学达到了什么修为。
输入输出格式
输入格式
第一行一个正整数 ,表示学院中有 个学员。
第二行一个正整数 ,表示有 条报告。
接下来 行,每一行一个正整数 和一个仅由小写字母组成的字符串 ,表示第 个同学的报告。
输出格式
输出包括 行,每一行一个字符串,表示每一个同学达到了什么修为。特别的,如果该同学什么修为都没达到,输
出0。
输入输出样例
输入样例1

8 10
1 gewu
1 zhizhi
1 chengyi
1 zhengxin
1 xiushen
1 qijia
1 zhiguo
1 pingtianxia
2 gewu
2 chengyi

输出样例1

pingtianxia
gewu
0
0
0
0
0
0

输出样例2

8 10
1 gewu
2 gewu
3 wogewule
4 wopingtianxiale
1 zhizhi
3 zhizhi
3 pingtianxia
8 gewu
8 zhizhi
5 gewu

输出样例2

zhizhi
gewu
0
0
gewu
0
0
zhizhi

思路

这道题我们可以直接模拟,但是要注意孔子的学生必须按照顺序来学习.这样我们就可以来多维护一个数组来处理当前学习的上一条是否已经学习完毕(因为这点我在比赛的时候WA了一次QAQ)

AC code

//由于L_Y_T在做这道题亩的时候因为rank垫底比较着急,所以思路比较乱(虽然这道题没啥思路)
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#define maxn 10010
using namespace std ;
int n , m ;
string ss[10]={"0","gewu","zhizhi","chengyi","zhengxin","xiushen","qijia","zhiguo","pingtianxia"} ;//预存一下学生们需要达成的状态
int num[maxn][10] ;
bool book[maxn] ;//好像定义了几个多余的数组....
int degue[maxn] ;
int main() {
    cin.tie(0) ;cout.tie(0) ;//感觉拼手速还是cin块...
    memset(num,0,sizeof(num));
    cin >> n >> m ;
    int opt ;
    string ch ;
    for(int i = 1 ; i <= n ; i ++) {//预处理,假设学生们都可以学习第一条
        num[i][0] = 1 ;
    }
    for(int i = 1 ; i <= m ; i ++) {
        cin >> opt >> ch ;
        for(int j = 1 ; j <= 8 ; j ++) {
            if(ch == ss[j])
            if(num[opt][j-1]!=0)  //如果上一条已经学完
                num[opt][j] = true ;
     	}
     	ch = "0" ;
    }
    int kkk = 0 ;
    for(int i = 1 ; i <= n ; i ++) {
        for(int j = 1 ; j <= 8 ; j ++){
            if(num[i][j]==0){
                break ;
            }
            kkk = j ;
            //cout << ss[j] << endl ; 
        }
        cout << ss[kkk] << endl ; 
        kkk = 0 ;
    }
    return 0 ;
}

PS:我们是最后一个AC第一题的(还罚时了QAQ)…