今日练习

今日练习

UVA11729 之前未完成,已AC;

UVA11300 错,已AC,待补充(

UVA11729

//
// Created by 21122 on 2022/5/11/0011.
//
#include<iostream>
#include<algorithm>
#include<vector>
#include<numeric>
using namespace std;

int main()
{
    int n;
    int index = 1;
    int Case = 1;
    while(true)
    {
        std::cin >> n;
        if(n == 0)
        {
            break;
        }
        //cout << "n is:" << n << endl;
        vector<vector<int>> v;
        int B, J;
        for(int i = 0; i < n; i++)
        {
            std::cin >> B >> J;             // B 是交代任务的时间、 J是执行任务的时间
            v.push_back(vector<int>{J, B});
//        vector<int> temp;
//        temp.push_back(B);
//        temp.push_back(J);
//        v.push_back(temp);

        }
        std::sort(v.begin(), v.end(), greater<vector<int>>());
        vector<vector<int>>::iterator iter;

//    for(iter = v.begin(); iter != v.end(); iter++)
//    {   //循环遍历(迭代法
//        for(int i = 0; i < v[0].size(); i ++)
//        {       //或 i < (*iter).size()
//            cout << (*iter)[i];
//        }
//        cout << endl;
//    }
//
//        for(int i = 0; i < v.size(); i++)
//        {   //下标遍历
//            for(int j = 0; j < v[0].size(); j++)
//            {
//                cout<<v[i][j] << " ";
//            }
//            cout << endl;
//        }

        int total_time = 0;
        //int work_time = 0;
        int temp = 0;
        for(int i = 0; i < v.size(); i++)
        {
            temp += v[i][1];
            total_time = max(total_time, temp + v[i][0]);
//            int time_of_doing = v[i][0];
//            int time_of_telling = v[i][1];
//
//            //work_time += time_of_doing - temp ? work_time > 0 : 0;
//            //if(temp >= )
//
//            //(*iter)[1] = ((time_of_doing - temp) <= 0)? 0 : (*iter)[1] - temp;
//
//            total_time += time_of_telling;
//
//            for(int j = 0; j <= i; j ++)
//            {   //对执行任务的时间进行处理
//                //int sum = std::accumulate(i + 1, v.size(), 0);
//
//                int sum = 0;
//                for(int t = j + 1; t < v.size(); t ++)
//                {
//                    sum += v[t][0];
//                }
//                //cout <<"sum is:" << sum << endl;
//                v[j][0] -= sum;
//                if (v[j][0] <= 0)
//                {
//                    v[j][0] = 0;
//                }
            //temp = time_of_telling;
        }


        cout << "Case " << Case++ << ": "<< total_time << endl;

//        int adding = 0;
//        for(iter = v.begin(); iter != v.end(); iter++)
//        {
////        for(int i = 0; i < v[0].size(); i ++)
////        {       //或 i < (*iter).size()
////            cout << (*iter)[i];
////        }
////        cout << endl;
//            adding = max(0, (*iter)[0]);
//        }

        //int adding = max_element([1, 2, 3, 4, 5]);
        //cout << "total_time is:" << total_time + adding<< endl;
        //std::cout <<"Case " << index <<": " << total_time + adding << endl;
        //index += 1;

//        for(int i = 0; i < v.size(); i++)
//        {   //下标遍历
//            for(int j = 0; j < v[0].size(); j++)
//            {
//                cout<<v[i][j] << " ";
//            }
//            cout << endl;
//        }
    }
    return 0;
}

UVA 11300

#include<iostream>
#include<algorithm>
#include <numeric>
#include<cstdio>

using namespace std;

const int maxn = 1000005;
long long arr[maxn];
long long temp[maxn];

int main()
{
    int n;


    while(std::cin >> n)    // != EOF//  ?无法通过测试
    //while(scanf("%d", &n) != EOF)
    {


        //std::cout << "n is:" << endl;
        long long sum = 0;
        for(int i = 1; i <= n; i++)
        {   //数据导入
            cin >> arr[i];
            sum += arr[i];
        }

        //long long avg = accumulate(arr + 0, arr + n, 0) / n;
        long long avg = sum / n;
        //std::cout << "avg is:" << avg << endl;
        //std::sort(arr, arr + n,greater<int>());   排序后会将原有顺序打乱,与题目中 “相邻交换” 的条件冲突

        temp[0] = 0;
        for(int i = 1;i < n; i++)
        {
            temp[i] = temp[i - 1] + arr[i] - avg;
        }

        std::sort(temp, temp + n);      //对 temp 数组排序,方便寻找中位数

        long long median = temp[n / 2];
        long long total_number = 0;
        for(int i = 0; i < n; i++)
        {
            total_number += std::abs(median - temp[i]);     //可能存在负数,例如:A 给 B 2个,则为 B 给 A -2 个,故使用 abs
        }

        cout << total_number << endl;

//        for(auto val : arr)
//        {
//            cout << val << endl;
//        }

//        int median;
//        if(n % 2 == 0)  //n 为偶数,取中间2个数的平均值
//        {
//            median = (arr[n / 2] + arr[n / 2 - 1]) / 2;
//        }
//        else            //n 为奇数,取中间那个数
//        {
//            median = arr[n / 2];
//        }
//
//        if(median == avg)
//        {
//            cout << 0 << endl;
//        }
//        else
//        {
//            cout << median << endl;
//        }

    }

    return 0;
}

总结

UVA11300 主要设计数学推理问题,Y同学该复习数学了阿!: (