CCF201812-1:샤오밍등교(C언어) 100점 답안

21176 단어 심로 역정.
CCF201812-1 샤오밍등교(C언어)
100점 정답.
제목:
제목 배경
소명은 한동성 정법대학 부속 중학교의 학생으로 매일 자전거를 타고 집과 학교를 왕복한다.그는 가능한 한 충분한 수면을 취하기 위해 학교에 가는 데 필요한 시간을 예상할 수 있기를 바란다.그는 학교에 갈 때 몇 개의 도로를 지나야 하는데, 서로 인접한 두 개의 도로 사이에 여러 개의 신호등이 설치되어 있다.
경주시의 신호등은 이렇게 일한다. 신호등마다 빨간색, 노란색, 녹색 세 개의 등과 카운트다운을 표시할 수 있는 표시판이 있다.신호등이 빨간불 r초, 노란불 y초, 파란불 g초로 설정되면 0시부터 [0,r)초 동안 빨간불이 켜져 차량이 통과하지 못한다. [r,r+g)초 동안 파란불이 켜져 차량이 통과할 수 있다. [r+g,r+g+y)초 동안 노란불이 켜져 차량이 통과하지 못하고 순서대로 순환한다. 카운트다운 표시판에 나타난 숫자 l(l>0)는 다음 신호등이 변화하는 초수를 가리킨다.
문제 설명
한 번 등교하는 길에 샤오밍은 길을 지나는 시간과 각 신호등이 샤오밍이 길목에 도착했을 때의 색깔과 카운트다운 초수를 기록했다.네가 이번 샤오밍이 학교에 가는 데 걸린 시간을 계산해 주기를 바란다.
입력 형식
입력한 첫 줄은 공백으로 구분된 세 개의 정수 r, y, g를 포함하여 신호등의 설정을 나타낸다.이 세 수는 모두 106을 넘지 않는다.
입력한 두 번째 줄은 정정수 n(n≤100)을 포함하고 소명이 모두 지나간 도로 구간수와 보이는 신호등의 수를 나타낸다.
다음 n 줄은 빈칸으로 구분된 두 개의 정수 k, t를 포함한다.k=0은 도로를 지나갔는데 t초가 걸렸고 여기는 t가 106을 넘지 않는다는 것을 나타낸다.k=1, 2, 3시에 각각 빨간색, 노란색, 녹색등을 보았고 카운트다운 표시판에 표시된 숫자는 t이다. 여기서 t는 각각 r, y, g를 초과하지 않는다.
출력 형식
이번 샤오밍이 학교에 다니는 데 걸린 시간을 나타내는 숫자를 출력하다.
샘플 입력
30 3 30
8
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3
샘플 출력
70
샘플 설명
샤오밍은 먼저 1구간 도로를 10초 동안 지나 5초간 빨간불을 기다린 뒤 2단 도로를 11초 동안 지나 2초간 노란등과 30초간 빨간불을 기다린 뒤 3구간, 4구간 도로를 각각 6, 3초 동안 지나 청신호를 통과한 뒤 마지막 도로를 3초 동안 지나간다.총 10+5+11+2+30+6+3+3=70초.
용례 규모와 약정을 평가하다
테스트 포인트 1, 2에는 신호등이 없습니다.
시험점 3, 4의 모든 신호등은 관찰될 때 녹색 등이다.
시험점 5, 6의 모든 신호등은 관찰될 때 모두 빨간불이다.
시험점 7, 8의 모든 신호등은 관찰될 때 모두 황등이다.
테스트 포인트 9, 10에는 여러 가지 가능한 상황이 나타날 것이다.
아이디어:
먼저 모든 입력 데이터를 저장하고 집중적으로 처리하며 마지막에 출력한다.입력한 데이터가 얼마나 되는지 확정할 수 없음→체인표 먼저 입력 체인표 → 대기열 체인표
코드:
/*
       :
	 -> -> -> 
       :
	r:   r  ;
	y:   y  ;
	g:   g  ;
	l:    ,         l  
      :
	k=0:    ,  t  
	k=1:      ,      t  (t=l 

#include 
#include 
#include 

typedef struct{
	int r;//     
	int y;//     
	int g;//     
}Light;

typedef struct _node{//       
	int k;
	int t;
	struct _node *next;
}Node; 

typedef struct{//     
	int n;
	Node *head;
}Queue;

Light* initLight(int r,int y,int g){//         
	Light* L = (Light*)malloc(sizeof(Light));
	L->r = r;
	L->y = y;
	L->g = g;
	return L;
} 

Queue* initQueue(int n){//     ,n      
	Queue* q = (Queue*)malloc(sizeof(Queue));
	q->n = n;
	Node* head = (Node*)malloc(sizeof(Node));
	head->next = NULL;
	q->head = head; 
	return q;
}

bool empty(Queue* q){//         
	if(q->head->next==NULL){
		return true;
	}else{
		return false;
	}
}

void enQueue(Queue* q,int k,int t){//    
	Node* new_node = (Node*)malloc(sizeof(Node));
	new_node->k = k;
	new_node->t = t;
	
	Node* p = q->head;
	while(p->next!=NULL){
		p = p->next;
	}
	new_node->next = p->next;
	p->next = new_node;
}

bool deQueue(Queue* q,int *k,int *t){//   ,   k,t 
	if(empty(q)){//        
		return false;
	}
	Node* p = q->head->next;
	*k = p->k;
	*t = p->t;
	q->head->next = p->next;
	free(p);
	return true;
}

int timeCost(Light* L,Queue* Move){//    
	int cost = 0;//   
	int k = 0;
	int t = 0;
	while(!empty(Move)) {
		deQueue(Move,&k,&t);
		if(k==0){
			cost = cost+t;
		}else if(k==1){
			cost = cost+t;
		}else if(k==2){
			cost = cost+t+(L->r); 
		}else{
			cost = cost;
		}
	}
	return cost;
} 

int main(int argc, char *argv[]) {
	//r,y,g     
	int r = 0;
	int y = 0;
	int g = 0;
	scanf("%d %d %d",&r,&y,&g);
	Light* L = initLight(r,y,g);
	
	//n    
	int n = 0;
	scanf("%d",&n);
	Queue* Move = initQueue(n);
	
	//k,t    
	int k = 0;
	int t = 0; 
	int i = 0;
	for(i=0;i<Move->n;i++){// C99  ,C99  for(int i =0;i
		scanf("%d %d",&k,&t);
		enQueue(Move,k,t);
	}
	
	int cost = 0;
	cost = timeCost(L,Move);
	printf("%d",cost);	 
	return 0;
}

평가 결과:
제출 시간: 02-05 14:20(2019년, 즉 정월 초하루) 코드 길이: 2.435KB프로그래밍 언어: C 평가 결과: 정확한 점수: 100시간 사용: 0ms공간 사용: 408.0KB
심로 요약:
이번에는 C99의 for 순환을 발견했습니다. 즉, for (int i = 0; i) 는 CCF에서 컴파일하면 오류를 컴파일합니다. C89의 for 순환으로 바꾸면: int i = 0; for (i = 0; i) 가 됩니다.
하지만 C99 헤더 파일 stdbool.h는 사용할 수 있다. CCF의 컴파일러도 C99를 지원하지 않는 것이 아니라 C99를 지원하지 않는다는 뜻이다.
여러분, 잘못되었거나 더 정확한 소식이 있으면 지적해 주셔서 대단히 감사합니다.

좋은 웹페이지 즐겨찾기