第10个没过,不李姐
查看原帖
第10个没过,不李姐
1096519
milk2715093695楼主2024/1/13 17:11

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
    int leftHand;
    int rightHand;
} person;

double max(person *, person *);
int compare(const void *, const void *);
void creatBigNumber(char *, int);
int compareBigNumber(char *, char *);
void multiplyBignumber(char *, int);
void divideBignumber(char *, char *, int);

int main(void) {
    int n;
    scanf("%d", &n);
    
    person people[n + 1];
    for (int i = 0; i < n + 1; ++i) {
        scanf("%d %d", &people[i].leftHand, &people[i].rightHand);
    }
    qsort(people + 1, n, sizeof(person), compare);
    
    char tot[100001] = "";
    creatBigNumber(tot, people[0].leftHand);
    char max[100001] = "";
    for (int i = 1; i <= n; ++i) {
        char temp[100001] = "";
        divideBignumber(temp, tot, people[i].rightHand);
        if (compareBigNumber(temp, max) == 1) {
            strcpy(max, temp);
        }
        multiplyBignumber(tot, people[i].leftHand);
    }
    
    printf("%s", max);
    
    return 0;
}

double max(person *p1, person *p2) {
    int num1 = p2->rightHand;
    int num2 = p1->leftHand * p1->rightHand;
    
    return (num1 > num2) ? (1.0 / (double)p1->rightHand) : ((double)p1->leftHand / (double)p2->rightHand);
}

int compare(const void *a, const void *b) {
    person *person1 = (person *)a;
    person *person2 = (person *)b;
    
    double num1 = max(person1, person2);
    double num2 = max(person2, person1);
    
    return (num1 > num2);
}

void creatBigNumber(char *tot, int num) {
    int index = 0;
    while (num != 0) {
        tot[index++] = num % 10 + '0';
        num /= 10;
    }
    for (int i = 0; i <= (index - 1) / 2; ++i) {
        char temp = tot[i];
        tot[i] = tot[index - i - 1];
        tot[index - i - 1] = temp;
    }
}

int compareBigNumber(char *num1, char *num2) {
    size_t len1 = strlen(num1);
    size_t len2 = strlen(num2);
    
    if (len1 > len2) {
        return 1;
    } else if (len1 < len2) {
        return -1;
    } else {
        return (strcmp(num1, num2) > 0) ? 1 : -1;
    }
}

void multiplyBignumber(char *num1, int num2) {
    char temp[100001] = "";
    int len = (int)strlen(num1);
    int carry = 0, index = 0;
    for (int i = len - 1; i >= 0; --i) {
        int num = (num1[i] - '0') * num2 + carry;
        temp[index++] = num % 10 + '0';
        carry = num / 10;
    }
    
    while (carry != 0) {
        temp[index++] = carry % 10 + '0';
        carry /= 10;
    }
    
    for (int i = 0; i < index; ++i) {
        num1[i] = temp[index - i - 1];
    }
}

void divideBignumber(char *ans, char *num1, int num2) {
    int temp = 0, index = 0, i = 0;
    int length = (int)strlen(num1);
    while (temp < num2 && i < length) {
        temp = temp * 10 + (num1[i] - '0');
        ++i;
    }
    for (; i < length; ++i) {
        if (temp < num2) {
            ans[index++] = '0';
            temp = temp * 10 + (num1[i] - '0');
        } else {
            ans[index++] = temp / num2 + '0';
            temp = temp % num2 * 10 + (num1[i] - '0');
        }
    }
    ans[index++] = temp / num2 + '0';
}
2024/1/13 17:11
加载中...