前半部分 WA,输出结果和 std 偏差在 10 以内,求调
查看原帖
前半部分 WA,输出结果和 std 偏差在 10 以内,求调
572779
lihugang楼主2024/10/29 13:17
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <utility>
#include <algorithm>
#include <vector>
#include <bitset>

int countOfTestcases, countOfCars = 0, countOfSpeedTesters = 0, lengthOfRoad, speedLimit;

typedef struct _car {
    int startPosition = 0;
    int originalSpeed = 0;
    int speedChangingRate = 0;
    bool isJudgingOverspeed = false;
    std::pair<int, int> overspeedInterval;
    std::pair<int, int> speedTestInterval;
} car;

car cars[100008];
int speedTesterPositions[100008];

int main(void) {
    #ifdef DEBUG
    freopen("detect.in", "r", stdin);
    freopen("detect.out", "w", stdout);
    #endif

    scanf("%d", &countOfTestcases);

    while (countOfTestcases--) {
        scanf("%d %d %d %d", &countOfCars, &countOfSpeedTesters, &lengthOfRoad, &speedLimit);

        for (int i = 0; i < countOfCars; i++) {
            scanf("%d %d %d", &cars[i].startPosition, &cars[i].originalSpeed, &cars[i].speedChangingRate);
            cars[i].isJudgingOverspeed = false;
            cars[i].overspeedInterval.first = -1;
            cars[i].overspeedInterval.second = -1;
        }
        for (int i = 0; i < countOfSpeedTesters; i++) scanf("%d", &speedTesterPositions[i]);

        speedTesterPositions[countOfSpeedTesters] = 0x3f3f3f3f;
        
        for (int i = 0; i < countOfCars; i++) {
            if (cars[i].speedChangingRate == 0) {
                if (cars[i].originalSpeed > speedLimit) {
                    cars[i].overspeedInterval.first = cars[i].startPosition;
                    cars[i].overspeedInterval.second = lengthOfRoad;
                }
            } else if (cars[i].speedChangingRate > 0) {
                cars[i].overspeedInterval.first = (int)ceil((long double)((long long)speedLimit * speedLimit - (long long)cars[i].originalSpeed * cars[i].originalSpeed) / (long double)((long double)2.0f * cars[i].speedChangingRate) + cars[i].startPosition + 1e-10);
               
                cars[i].overspeedInterval.second = lengthOfRoad;

            } else if (cars[i].speedChangingRate < 0) {
                if (cars[i].originalSpeed > speedLimit) {
                    cars[i].overspeedInterval.second = (int)floor((long double)((long long)speedLimit * speedLimit - (long long)cars[i].originalSpeed * cars[i].originalSpeed) / (long double)((long double)2.0f * cars[i].speedChangingRate) + cars[i].startPosition - 1e-10);
                    cars[i].overspeedInterval.first = cars[i].startPosition;
                }

            }
        }

        int carsCaught = 0;

        std::vector<std::pair<int, int>> overSpeedIntervals;

        for (int i = 0; i < countOfCars; i++) {
            if (cars[i].overspeedInterval.first >= 0 && cars[i].overspeedInterval.first <= lengthOfRoad) {
                auto theFirstSpeedTester = std::lower_bound(
                    speedTesterPositions,
                    speedTesterPositions + countOfSpeedTesters + 1, cars[i].overspeedInterval.first
                );
                

                if (*theFirstSpeedTester <= cars[i].overspeedInterval.second) {
                    cars[i].isJudgingOverspeed = true;
                    carsCaught++;

                    cars[i].speedTestInterval.first = theFirstSpeedTester - speedTesterPositions;
                    cars[i].speedTestInterval.second = std::upper_bound(
                        speedTesterPositions,
                        speedTesterPositions + countOfSpeedTesters, cars[i].overspeedInterval.second
                    ) - 1 - speedTesterPositions;

                    overSpeedIntervals.push_back(cars[i].speedTestInterval);

                
                }
            }
        }

        std::sort(overSpeedIntervals.begin(), overSpeedIntervals.end(), [](std::pair<int, int> &a, std::pair<int, int> &b) -> bool {
            if (a.second == b.second) return a.first < b.first;
            return a.second < b.second;
        });

        int rightBorder = -1, remainTesters = 0;
        for (int i = 0; i < overSpeedIntervals.size(); i++) {
            if (overSpeedIntervals[i].first <= rightBorder) continue;
            remainTesters++;
            rightBorder = overSpeedIntervals[i].second;
        }

        printf("%d %d\n", carsCaught, countOfSpeedTesters - remainTesters);
    }

    return 0;
}

无法通过 detect4.in

左边为我的代码的输出结果,右边为 detect4.ans

谢谢

2024/10/29 13:17
加载中...