[Logo] Форум DL
  [DL]  На главную страницу 
Индекс форума ->Олимпиадное программирование ->Методика подготовки к IOI 2007 - ...
Автор Сообщение
Михаил Долинский

Темы: 1984
Сообщений: 47252

Мой профиль
http://dl.gsu.by/doc/use/programmers_task.htm

В случае неоднозначного ответа или необходимости оценки неполного решения, кроме перечисленного выше, необходима специальная программа - чекер, которая должна оценивать правильность или некоторое приближение к оптимальному решению. Она будет запускаться для каждого теста с параметрами:
checker.exe <входной файл> <правильный выходной файл> <выходной файл участника> <максимальное количество баллов за тест>

Чтобы для проверки использовался чекер необходимо внести нужную запись в task.cfg.
После выполнения чекера в первой строке файла "$result$.txt" должно быть количество баллов за тест, во второй желательно указать комментарии.
Пример:
запуск checker.exe 1.in 1.out output.txt 100
После чего файл "$result$.txt" содержит следующее:
0
Wrong answer. 


#include <fstream>
#include <string>
#include <cstring>
#include <iostream>
#define F(i,n) for (int i=0;i<(int)n;i++)
using namespace std;
ifstream in,ro,uo;
ofstream res;
char score[256];
int a[30][30];
void term() {
	in.close();
	ro.close();
	uo.close();
	res.close();
	exit(0);
}

void bad(const char *msg) {
	res<<"0\n"<<msg;
	term();
}
void OK() {
	res<<score;
	term();
}
string s1,s2;
int n;
int f(int x,int y,int c) {
	if (a[x][y]!=c) return 0;
	a[x][y]=0;
	return f(x,y-1,c)+f(x,y+1,c)+f(x+((x+y)%2==n%2?-1:1),y,c)+1;
}

int main(int argc,char** argv) {
	if (argc!=5) return -1;
	in.open(argv[1]);
	ro.open(argv[2]);
	uo.open(argv[3]);
	res.open("$result$.txt");
	strcpy(score,argv[4]);
	ro>>s1; uo>>s2;
	if (s1!=s2) {
		if (s1=="nemoguce") bad("Answer doesn't exist but user's output isn't \"nemoguce\"");
		if (s2=="nemoguce") bad("Answer exists but user's output is \"nemoguce\"");
	} else if (s1=="nemoguce") OK();
	uo.seekg(0);
	in>>n;
	F(i,30) F(j,30) a[i][j]=0;
	F(i,n*2) {
		in>>s1; uo>>s2;
		if (s1.size()!=s2.size()) bad("Incorrect output format: wrong line length");
		F(j,s1.size()) {
			if (s1[j]=='.') {
				if (s2[j]!='.') 
					bad("Incorrect output format: point expected, something else found");
			}
			if (s1[j]=='0') {
				if (s2[j]>='1'&&s2[j]<='6') 
					a[i+1][j+1+max(i-n,n-i-1)]=s2[j]-'0';
				else
					bad("Incorrect output format: digit from interval 1..6 expected, something else found");
			}
		}
	}
	
	//F(i,30) {F(j,30) cerr<<a[i][j]; cerr<<endl;}
	F(i,30) F(j,30) if (a[i][j])
		if (f(i,j,a[i][j])!=3) bad("Wrong segment size");
	OK();
}

Кирилл Кардаш

Темы: 1
Сообщений: 14

Мой профиль
https://dl.gsu.by/task.jsp?nid=2280208&cid=1322
#include <fstream>
#include <string>
#include <cstring>
#include <iostream>
#include <math.h>
#define F(i,n) for (int i=0;i<(int)n;i++)
using namespace std;
ifstream in,ro,uo;
ofstream res;
char score[256];
int a[30][30];
void term() {
	in.close();
	ro.close();
	uo.close();
	res.close();
	exit(0);
}

void bad(const char *msg) {
	res<<"0\n"<<msg;
	term();
}
void OK() {
	res<<score;
	term();
}

bool doubleCompare(long double expected, long double result, long double MAX_DOUBLE_ERROR) {
    MAX_DOUBLE_ERROR += 1E-15;
    if (fabsl(result - expected) <= MAX_DOUBLE_ERROR) {
        return true;
    } else {
        double minv = min(expected * (1.0l - MAX_DOUBLE_ERROR),
                          expected * (1.0l + MAX_DOUBLE_ERROR));
        double maxv = max(expected * (1.0l - MAX_DOUBLE_ERROR),
                          expected * (1.0l + MAX_DOUBLE_ERROR));
        return result >= minv && result <= maxv;
    }
}

string s1, s2;

int main(int argc,char** argv) {
	if (argc!=5) return -1;
	in.open(argv[1]);
	ro.open(argv[2]);
	uo.open(argv[3]);
	res.open("$result$.txt");
	strcpy(score,argv[4]);
	ro>>s1;
	if (uo.peek() == EOF) bad("Real number expected, nothing found");
	uo>>s2;
	errno = 0;
	long double x = stold(s2);
	if (errno != 0) bad("Real number expected, something else found");
	long double y = stold(s1);
	if (!doubleCompare(x, y, 1e-6)) bad("Wrong answer");
	OK();
}


______________________
Наконец-то красный | 2437
Кирилл Кардаш

Темы: 1
Сообщений: 14

Мой профиль
https://dl.gsu.by/task.jsp?nid=2362684&cid=1349

#include <fstream>
#include <string>
#include <cstring>
#include <iostream>
#include <math.h>
#include <vector>
#include <queue>
using namespace std;
ifstream in,ro,uo;
ofstream res;
char score[256];

void term() {
	in.close();
	ro.close();
	uo.close();
	res.close();
	exit(0);
}

int mn = 0;

void bad(const char *msg) {
	res<<mn<<'\n'<<msg;
	term();
}

void OK() {
	res<<score;
	term();
}

long long readint() {
	if (uo.peek() == EOF) bad("Integer expected, nothing found");
	string sval; uo >> sval;
	long long val = -1;
	try {
		val = stoll(sval);
	} catch (exception const &ex) {
		bad("Integer expected, something else found");
	}
	return val;
}

const int N = 310000;
const int LOGN = 20;

int n, m, a[N], b[N], dep[N], par[N], jmp[N][LOGN];
bool vv[N];
vector<int> g[N];

int dist(int u, int v) {
	if (dep[u] < dep[v])
		swap(u, v);
	int ans = 0;
	for (int k = LOGN - 1; k >= 0; k--)
		if (dep[u] - (1 << k) >= dep[v]) {
			ans += (1 << k);
			u = jmp[u][k];
		}
	for (int k = LOGN - 1; k >= 0; k--)
		if (jmp[u][k] != jmp[v][k]) {
			ans += (2 << k);
			u = jmp[u][k];
			v = jmp[v][k];
		}
	if (u != v) ans += 2;
	return ans;
}

vector<int> p1, p2;

int main(int argc,char** argv) {
	if (argc!=5) return -1;
	in.open(argv[1]);
	ro.open(argv[2]);
	uo.open(argv[3]);
	res.open("$result$.txt");
	strcpy(score,argv[4]);
	in >> n >> m;
	for (int i = 1; i <= m; i++)
		in >> a[i];
	for (int i = 1; i <= m; i++)
		in >> b[i];
	for (int i = 1; i <= n - 1; i++) {
		int u, v; in >> u >> v;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	long long rans; ro >> rans;
	long long uans = readint();
	if (uans != rans) bad("Time is wrong");
	mn = atoi(score) / 10 * 3;
	for (int i = 1; i <= m + m; i++) {
		int cur = readint();
		if (cur < 1 || cur > m) bad("Invalid route");
		if (i % 2 == 1) p1.push_back(cur);
		else p2.push_back(cur);
	}
	for (int i = 1; i <= m; i++)
		vv[i] = false;
	for (int x : p1) {
		if (vv[x]) bad("Invalid route");
		vv[x] = true;
	}
	for (int i = 1; i <= m; i++)
		vv[i] = false;
	for (int x : p2) {
		if (vv[x]) bad("Invalid route");
		vv[x] = true;
	}
	vector<int> path;
	path.push_back(1);
	for (int i = 0; i < m; i++) {
		path.push_back(a[p1[i]]);
		path.push_back(b[p2[i]]);
	}
	path.push_back(1);
	par[1] = -1;
	queue<int> qq;
	qq.push(1);
	while (!qq.empty()) {
		int v = qq.front(); qq.pop();
		int p = par[v];
		dep[v] = (p == -1 ? 0 : dep[p] + 1);
		jmp[v][0] = (p == -1 ? v : p);
		for (int k = 1; k < LOGN; k++)
			jmp[v][k] = jmp[jmp[v][k - 1]][k - 1];
		for (int u : g[v]) if (u != par[v]) {
			par[u] = v;
			qq.push(u);
		}
	}
	long long real_dist = 0;
	for (int i = 0; i + 1 < (int) path.size(); i++)
		real_dist += dist(path[i], path[i + 1]);
	if (real_dist != rans) bad("Invalid route");
	OK();
}


______________________
Наконец-то красный | 2437
Кирилл Кардаш

Темы: 1
Сообщений: 14

Мой профиль
https://dl.gsu.by/task.jsp?nid=2362684&cid=1349

В задаче требуется вывести ответ и способ его получить. В случае, если программа выводит только ответ без способа, она должна оцениваться в 30% баллов. Возможно ли это реализовать?
______________________
Наконец-то красный | 2437
 
Индекс форума ->Олимпиадное программирование ->Методика подготовки к IOI 2007 - ...
Time:0,047