답안 #20911

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
20911 2017-03-19T15:20:00 Z model_code Soccer (JOI17_soccer) C++11
100 / 100
1503 ms 45516 KB
#include <cstdio>
#include <vector>
#include <queue>

int H,W,N;
long long A,B,C;
int pos_h[100008];
int pos_w[100008];
int min_move_cost[508][508];
int queue_h[1000008];
int queue_w[1000008];
int adj_h[5]={0,-1,0,1};
int adj_w[5]={-1,0,1,0};
using namespace std;
priority_queue <pair<long long,int>,vector<pair<long long,int> >,greater<pair<long long,int> > > pq;
long long sol[508][508][5];
int main() {
	scanf("%d%d%lld%lld%lld%d",&H,&W,&A,&B,&C,&N);
	for(int i=0;i<N;i++) scanf("%d%d",&pos_h[i],&pos_w[i]);
	int qst,qls;
	qst=0; qls=N;
	//�앮쐿��
	for(int i=0;i<=H;i++) for(int j=0;j<=W;j++) min_move_cost[i][j]=99999999;
	for(int i=0;i<N;i++) {
		queue_h[i]=pos_h[i];
		queue_w[i]=pos_w[i];
		min_move_cost[queue_h[i]][queue_w[i]]=0;
	}
	//亮끻꽛�덃렋榮㏂겎�쒌꺖�ャ굮�얇걚�ヨ죱�뤵궠�밤깉��츞��
	while(qst<qls) {
		int new_c=min_move_cost[queue_h[qst]][queue_w[qst]]+1;
		for(int i=0;i<4;i++) {
			int new_h=queue_h[qst]+adj_h[i];
			int new_w=queue_w[qst]+adj_w[i];
			if(new_h<0||new_h>H) continue;
			if(new_w<0||new_w>W) continue;
			if(min_move_cost[new_h][new_w]<99999999) continue;
			min_move_cost[new_h][new_w]=new_c;
			queue_h[qls]=new_h;
			queue_w[qls++]=new_w;
		}
		qst++;
	}
	//�앮쐿��
	long long INF=1000000007;
	INF*=INF;
	for(int i=0;i<=H;i++) for(int j=0;j<=W;j++) for(int k=0;k<5;k++) sol[i][j][k]=INF;
	//�묆걤(0節�4)*10^7 + �쀧㎉�뺠퇌�� * 5000 + �긺㎉�뺠퇌��
	//����러�믦㎗��
	pq.push(make_pair(0,pos_h[0]*5000+pos_w[0]+40000000));
	while(pq.size()) {
		long long now_cost=pq.top().first;
		int now_temp=pq.top().second;
		int now_type=now_temp/10000000;
		now_temp%=10000000;
		int now_h=now_temp/5000;
		int now_w=now_temp%5000;
		pq.pop();
		if(sol[now_h][now_w][now_type]<INF) continue;
		sol[now_h][now_w][now_type]=now_cost;
		if(now_type==4) {
			for(int i=0;i<4;i++) {
				int new_h=now_h+adj_h[i];
				int new_w=now_w+adj_w[i];
				if(new_h<0||new_h>H) continue;
				if(new_w<0||new_w>W) continue;
				pq.push(make_pair(now_cost+C,new_h*5000+new_w+40000000));
			}
			for(int i=0;i<4;i++) {
				pq.push(make_pair(now_cost+B,now_h*5000+now_w+10000000*i));
			}
		} else {
			pq.push(make_pair(now_cost+C*min_move_cost[now_h][now_w],now_h*5000+now_w+40000000));
			int new_h=now_h+adj_h[now_type];
			int new_w=now_w+adj_w[now_type];
			if(new_h<0||new_h>H) continue;
			if(new_w<0||new_w>W) continue;
			pq.push(make_pair(now_cost+A,new_h*5000+new_w+10000000*now_type));
		}
	}
	printf("%lld\n",sol[pos_h[N-1]][pos_w[N-1]][4]);
	return 0;
}

Compilation message

soccer.cpp: In function 'int main()':
soccer.cpp:18:47: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%lld%lld%lld%d",&H,&W,&A,&B,&C,&N);
                                               ^
soccer.cpp:19:56: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=0;i<N;i++) scanf("%d%d",&pos_h[i],&pos_w[i]);
                                                        ^
# 결과 실행 시간 메모리 Grader output
1 Correct 263 ms 24012 KB Output is correct
2 Correct 0 ms 20856 KB Output is correct
3 Correct 1116 ms 33228 KB Output is correct
4 Correct 1169 ms 45516 KB Output is correct
5 Correct 359 ms 27084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1389 ms 45516 KB Output is correct
2 Correct 1329 ms 45516 KB Output is correct
3 Correct 916 ms 33228 KB Output is correct
4 Correct 1029 ms 33228 KB Output is correct
5 Correct 969 ms 33228 KB Output is correct
6 Correct 1183 ms 33228 KB Output is correct
7 Correct 1276 ms 45516 KB Output is correct
8 Correct 1119 ms 45516 KB Output is correct
9 Correct 1346 ms 45516 KB Output is correct
10 Correct 153 ms 27084 KB Output is correct
11 Correct 1333 ms 45516 KB Output is correct
12 Correct 1386 ms 45516 KB Output is correct
13 Correct 926 ms 33228 KB Output is correct
14 Correct 1419 ms 45516 KB Output is correct
15 Correct 1043 ms 45516 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 263 ms 24012 KB Output is correct
2 Correct 0 ms 20856 KB Output is correct
3 Correct 1116 ms 33228 KB Output is correct
4 Correct 1169 ms 45516 KB Output is correct
5 Correct 359 ms 27084 KB Output is correct
6 Correct 1389 ms 45516 KB Output is correct
7 Correct 1329 ms 45516 KB Output is correct
8 Correct 916 ms 33228 KB Output is correct
9 Correct 1029 ms 33228 KB Output is correct
10 Correct 969 ms 33228 KB Output is correct
11 Correct 1183 ms 33228 KB Output is correct
12 Correct 1276 ms 45516 KB Output is correct
13 Correct 1119 ms 45516 KB Output is correct
14 Correct 1346 ms 45516 KB Output is correct
15 Correct 153 ms 27084 KB Output is correct
16 Correct 1333 ms 45516 KB Output is correct
17 Correct 1386 ms 45516 KB Output is correct
18 Correct 926 ms 33228 KB Output is correct
19 Correct 1419 ms 45516 KB Output is correct
20 Correct 1043 ms 45516 KB Output is correct
21 Correct 309 ms 24012 KB Output is correct
22 Correct 1416 ms 33228 KB Output is correct
23 Correct 1293 ms 33228 KB Output is correct
24 Correct 1496 ms 33228 KB Output is correct
25 Correct 1189 ms 33228 KB Output is correct
26 Correct 1156 ms 33228 KB Output is correct
27 Correct 669 ms 21324 KB Output is correct
28 Correct 786 ms 21324 KB Output is correct
29 Correct 1176 ms 27084 KB Output is correct
30 Correct 956 ms 24012 KB Output is correct
31 Correct 1406 ms 45516 KB Output is correct
32 Correct 1503 ms 45516 KB Output is correct
33 Correct 1079 ms 33228 KB Output is correct
34 Correct 1419 ms 45516 KB Output is correct
35 Correct 749 ms 21708 KB Output is correct