모처럼, 인형문제를 시뮬레이션이 안된다고 해서, 중간고사도 끝났겠다. 너 잘걸렸다 싶어서,
오늘 하루종일 붙잡아서 겨우 부득부득 이를 갈면서 풀어냈습니다...ㅋㅋㅋㅋㅋㅋㅋㅋ
근데... 이걸 올리고 컴파일이란녀석을 시켜봤더니 런타임에러라는 말이 왠말입니까;;;
스트럭쳐구문에 대한 포인터가 안먹히는건가요???...
너무 답답해서 돌아가시겠어요...;ㄴ;
한번은, 설마.. 싶어서 std::cin으로 돌린것들 모두 scanf로 갈아치워주고... 그래도 작동을 안해요...=_=;;;
Cout쪽도 갈아줘야 하는건지;;;(어짜피 요건 Call by Reference라서 상관없잖아요;;)
아님 스트럭쳐 포인터가 안먹힌다면, 어떻게 이놈을 설정해야 한다는건지...
누가 제 소스에서 메모리 참조 에러가 날만한 부분을 분석해주실 수 있으신가염?ㅠ_ㅠ
~~~ cpp
#include
#include
#define MAX 100000
using namespace std;
typedef struct _arr {
int val;
int idx;
} data;
void merge(int,int,data*);
void program();
int main() {
int casen;
scanf("%d",&casen);
while(casen--) {
program();
}
return 0;
}
void merge(int left, int right, data* arr) {
if((right-left)==1) return;
int half=(left+right)/2;
merge(left,half,arr);
merge(half,right,arr);
int i=left;
int j=half;
int k=left;
data temp[MAX];
while(i<half&&j<right) {
if(arr[i].val<arr[j].val) {
temp[k].val=arr[i].val;
temp[k++].idx=arr[i++].idx;
}
else {
temp[k].val=arr[j].val;
temp[k++].idx=arr[j++].idx;
}
}
while(i<half) {
temp[k].val=arr[i].val;
temp[k++].idx=arr[i++].idx;
}
while(j<right) {
temp[k].val=arr[j].val;
temp[k++].idx=arr[j++].idx;
}
for(i=left;i<right;i++) {
arr[i].val=temp[i].val;
arr[i].idx=temp[i].idx;
}
}
void program() {
int type=0, g_doll=0;
int remain=0;
data arr[MAX];
int total=0;
int used[MAX]={0};
int temp;
scanf("%d %d",&type,&g_doll);
remain=g_doll;
for(int i=0;i<type;i++) {
scanf("%d",&arr[i].val);
arr[i].idx=i;
total+=arr[i].val;
}
merge(0,type,arr);
for(int i=0;i<type;i++) {
if(arr[i].val*type<=g_doll) {
used[arr[i].idx]=arr[i].val;
remain-=arr[i].val;
if(arr[i].val*type<g_doll) {
g_doll+=((g_doll/type)+(g_doll%type?1:0)-(arr[i].val))/type;
}
continue;
}
used[arr[i].idx]=g_doll/type;
remain-=g_doll/type;
temp=i;
}
used[arr[temp].idx]+=(remain<arr[temp].val?remain:arr[temp].val);
for(int i=0;i<type;i++) {
cout<<used[i]<<" ";
}
cout<<endl;
}
관리자 권한으로 코드를 보기 편하도록 본문을 수정하였습니다. ;
일단 런타임 에러는 함수 내에서 잡고 있는 로컬 변수의 크기가 너무 커서 생기는 stack oveflow 때문인것 같습니다.
merge와 program 함수 내에 있는 data arr[MAX], data temp[MAX], int used[MAX] 를 전역으로 잡고 보내보니 wrong answer가 나오네요.
공상가
모처럼, 인형문제를 시뮬레이션이 안된다고 해서, 중간고사도 끝났겠다. 너 잘걸렸다 싶어서,
오늘 하루종일 붙잡아서 겨우 부득부득 이를 갈면서 풀어냈습니다...ㅋㅋㅋㅋㅋㅋㅋㅋ
근데... 이걸 올리고 컴파일이란녀석을 시켜봤더니 런타임에러라는 말이 왠말입니까;;;
스트럭쳐구문에 대한 포인터가 안먹히는건가요???...
너무 답답해서 돌아가시겠어요...;ㄴ;
한번은, 설마.. 싶어서 std::cin으로 돌린것들 모두 scanf로 갈아치워주고... 그래도 작동을 안해요...=_=;;;
Cout쪽도 갈아줘야 하는건지;;;(어짜피 요건 Call by Reference라서 상관없잖아요;;)
아님 스트럭쳐 포인터가 안먹힌다면, 어떻게 이놈을 설정해야 한다는건지...
누가 제 소스에서 메모리 참조 에러가 날만한 부분을 분석해주실 수 있으신가염?ㅠ_ㅠ
~~~ cpp
#include
#include
#define MAX 100000
using namespace std;
typedef struct _arr {
int val;
int idx;
} data;
void merge(int,int,data*);
void program();
int main() {
int casen;
scanf("%d",&casen);
while(casen--) {
program();
}
return 0;
}
void merge(int left, int right, data* arr) {
if((right-left)==1) return;
int half=(left+right)/2;
merge(left,half,arr);
merge(half,right,arr);
int i=left;
int j=half;
int k=left;
data temp[MAX];
while(i<half&&j<right) {
if(arr[i].val<arr[j].val) {
temp[k].val=arr[i].val;
temp[k++].idx=arr[i++].idx;
}
else {
temp[k].val=arr[j].val;
temp[k++].idx=arr[j++].idx;
}
}
while(i<half) {
temp[k].val=arr[i].val;
temp[k++].idx=arr[i++].idx;
}
while(j<right) {
temp[k].val=arr[j].val;
temp[k++].idx=arr[j++].idx;
}
for(i=left;i<right;i++) {
arr[i].val=temp[i].val;
arr[i].idx=temp[i].idx;
}
}
void program() {
int type=0, g_doll=0;
int remain=0;
data arr[MAX];
int total=0;
int used[MAX]={0};
int temp;
scanf("%d %d",&type,&g_doll);
remain=g_doll;
for(int i=0;i<type;i++) {
scanf("%d",&arr[i].val);
arr[i].idx=i;
total+=arr[i].val;
}
merge(0,type,arr);
for(int i=0;i<type;i++) {
if(arr[i].val*type<=g_doll) {
used[arr[i].idx]=arr[i].val;
remain-=arr[i].val;
if(arr[i].val*type<g_doll) {
g_doll+=((g_doll/type)+(g_doll%type?1:0)-(arr[i].val))/type;
}
continue;
}
used[arr[i].idx]=g_doll/type;
remain-=g_doll/type;
temp=i;
}
used[arr[temp].idx]+=(remain<arr[temp].val?remain:arr[temp].val);
for(int i=0;i<type;i++) {
cout<<used[i]<<" ";
}
cout<<endl;
}
17년 전