关于c语言的贪心算法,这里我没有采用结构体,想用归并排序来排序(因为冒泡会超时),不知道哪里出了问题,自认为归并排序也许是出问题了,我试了很多例子也都是对的,但是交上去只对了一半用例,错误的原因是WA
#include
long long n;
long long x;
long long y;
long long i,j;
long long a=0;
long long qian=0;
int jiafenx[200010],jianfenx[200010];
int jiafeny[200010],jianfeny[200010];
int jianfenx2[200010],jianfeny2[200010];
int jiafengeshu=0,jianfengeshu=0;
int jiafeny2[200010];
void merge_sort_recursive(int arr[], int reg[], int start, int end) {
if (start >= end)
return;
int len = end - start, mid = (len >> 1) + start;
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
merge_sort_recursive(arr, reg, start1, end1);
merge_sort_recursive(arr, reg, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2){
// reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
if(arr[start1]>arr[start2]){
reg[k]=arr[start2];
jiafeny2[k]=jiafeny[start2];
k++;
start2++;
}
else{
reg[k]=arr[start1];
jiafeny2[k]=jiafeny[start1];
k++;
start1++;
}
}
while (start1 <= end1){
reg[k] = arr[start1];
jiafeny2[k]=jiafeny[start1];
k++;
start1++;
}
while (start2 <= end2){
reg[k] = arr[start2];
jiafeny2[k]=jiafeny[start2];
k++;
start2++;
}
for (k = start; k <= end; k++){
arr[k] = reg[k];
jiafeny[k]=jiafeny2[k];
}
}
void merge_sort(int arr[], const int len) {
int reg[len];
merge_sort_recursive(arr, reg, 0, len - 1);
}
void merge_sort2_recursive(int arr[], int reg[], int start, int end) {
if (start >= end)
return;
int len = end - start, mid = (len >> 1) + start;
int start1 = start, end1 = mid;
int start2 = mid + 1, end2 = end;
merge_sort2_recursive(arr, reg, start1, end1);
merge_sort2_recursive(arr, reg, start2, end2);
int k = start;
while (start1 <= end1 && start2 <= end2){
// reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
if(arr[start1]>arr[start2]){
jianfenx2[k]=jianfenx[start1];
jianfeny2[k]=jianfeny[start1];
k++;
start1++;
}
else{
jianfenx2[k]=jianfenx[start2];
jianfeny2[k]=jianfeny[start2];
k++;
start2++;
}
}
while (start1 <= end1){
jianfenx2[k]=jianfenx[start1];
jianfeny2[k]=jianfeny[start1];
k++;
start1++;
}
while (start2 <= end2){
jianfenx2[k]=jianfenx[start2];
jianfeny2[k]=jianfeny[start2];
k++;
start2++;
}
for (k = start; k <= end; k++){
jianfenx[k]=jianfenx2[k];
jianfeny[k]=jianfeny2[k];
}
}
void merge_sort2(int arr[], const int len){
int reg[len];
merge_sort2_recursive(arr, reg, 0, len - 1);
}
int main(){
scanf("%lld",&n);
i=0,j=0;
while(i+j();
scanf("%lld",&x);
getchar();
scanf("%lld",&y);
if(y<=0){
jianfenx[i]=x;
jianfeny[i]=y;
jianfengeshu++;
i++;
}
else{
jiafenx[j]=x;
jiafeny[j]=y;
jiafengeshu++;
j++;
}
}
//先打jiafen的龙 从x最小打到最大
merge_sort(jiafenx,jiafengeshu);
for(i=0;iif(a>=jiafenx[i]){
a=a+jiafeny[i];
}
else{
qian=qian+jiafenx[i]-a;
a=jiafenx[i]+jiafeny[i];
}
}
//再打jianfen的龙 从打完的a最大打到最小
int chazhi[200010];
for(i=0;i[i]=jianfenx[i]+jianfeny[i];
}
merge_sort2(chazhi,jianfengeshu);
for(i=0;iif(a>=jianfenx[i]){
a=a+jianfeny[i];
}
else{
qian=qian+jianfenx[i]-a;
a=jianfenx[i]+jianfeny[i];
}
}
printf("%lld\n",qian);
return 0;
}
归并排序都是有三个参数的,你这个有点问题
可以试试换成快速排序
#include <stdio.h>
long long n;
long long x;
long long y;
long long i,j;
long long a=0;
long long qian=0;
int jiafenx[200010],jianfenx[200010];
int jiafeny[200010],jianfeny[200010];
int jianfenx2[200010],jianfeny2[200010];
int jiafengeshu=0,jianfengeshu=0;
int jiafeny2[200010];
void QuickSort1(int t[],int Begin,int End)
{
if(Begin>=End) return;
int Left=Begin,Right=End;
int tem=t[Begin];
while(Begin<End)
{
while(Begin<End&&t[End]>=tem)
{
End--;
}
t[Begin]=t[End];
while(Begin<End&&t[Begin]<=tem)
{
Begin++;
}
t[End]=t[Begin];
}
t[Begin]=tem;
QuickSort1(t,Left,Begin-1);
QuickSort1(t,Begin+1,Right);
}
void QuickSort2(int t[],int Begin,int End)
{
if(Begin>=End) return;
int Left=Begin,Right=End;
int tem=t[Begin];
while(Begin<End)
{
while(Begin<End&&t[End]<=tem)
{
End--;
}
t[Begin]=t[End];
while(Begin<End&&t[Begin]>=tem)
{
Begin++;
}
t[End]=t[Begin];
}
t[Begin]=tem;
QuickSort2(t,Left,Begin-1);
QuickSort2(t,Begin+1,Right);
}
int main(){
scanf("%lld",&n);
i=0,j=0;
while(i+j<n){
getchar();
scanf("%lld",&x);
getchar();
scanf("%lld",&y);
if(y<=0){
jianfenx[i]=x;
jianfeny[i]=y;
jianfengeshu++;
i++;
}
else{
jiafenx[j]=x;
jiafeny[j]=y;
jiafengeshu++;
j++;
}
}
//先打jiafen的龙 从x最小打到最大
QuickSort1(jiafenx,0,jiafengeshu-1);
for(i=0;i<jiafengeshu;i++){
if(a>=jiafenx[i]){
a=a+jiafeny[i];
}
else{
qian=qian+jiafenx[i]-a;
a=jiafenx[i]+jiafeny[i];
}
}
//再打jianfen的龙 从打完的a最大打到最小
int chazhi[200010];
for(i=0;i<jianfengeshu;i++){
chazhi[i]=jianfenx[i]+jianfeny[i];
}
QuickSort2(chazhi,0,jianfengeshu-1);
for(i=0;i<jianfengeshu;i++){
if(a>=jianfenx[i]){
a=a+jianfeny[i];
}
else{
qian=qian+jianfenx[i]-a;
a=jianfenx[i]+jianfeny[i];
}
}
printf("%lld\n",qian);
return 0;
}