JOI2007本選sol_check@C++
前回記事で書いたとおり、JOI2007本選問題4の解答チェックプログラムのソースがないっぽいので、自分で作った。
もちろん、このソース自身が間違ってる可能性も十分にあるので注意。
#include <error.h> #include <cstdio> #include <vector> #include <algorithm> using namespace std; int main(int argc, char *argv[], char *envp[]) { if(argc < 3) { printf("usage: ./sol_check INPUT OUTPUT\n"); return 1; } char *input_name = argv[1]; char *output_name = argv[2]; FILE *input = fopen(input_name, "r"); if(!input){perror(input_name);return -1;} FILE *output = fopen(output_name, "r"); if(!output){perror(output_name);return -1;} int n; int m; fscanf(input, "%d\n", &n); fscanf(input, "%d\n", &m); vector<int> dest(n); vector<int> revdest(n); vector<bool> saflags(n-1); for(int i=0;i<n;i++) { int c; fscanf(output, "%d", &c); c--; dest[i] = c; revdest.at(dest[i]) = i; } for(int i=0;i<m;i++) { int a; int b; fscanf(input, "%d %d", &a, &b); a--; b--; if(revdest[a] >= revdest[b]) { printf("wrong\n"); fclose(input); fclose(output); return -1; } else if(revdest[a] + 1 == revdest[b]) { saflags.at(revdest[a]) = true; } } bool single_answer_flag = true; for(int i=0;i<n-1;i++) { single_answer_flag = single_answer_flag && saflags[i]; } bool amaflag; fscanf(output, "%hhd", &amaflag); if(amaflag != !single_answer_flag) { printf("wrong\n"); fclose(input); fclose(output); return -1; } printf("correct\n"); fclose(input); fclose(output); return 0; }