请教这个C++问题,C++算法的问题

  1. C++的问题

  2. C++算法的问题

  3. C++的问题 见图片

  4. C++算法的问题

  5. C++算法的问题
    img

  6. img

img

img


// ConsoleApplication13.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <malloc.h>

using namespace std;

int main()
{
    int n = 0, m = 0;
    int min = 1;
    int count = 0;
    int loc,len,flag,flag2;
    cin >> n;
    cin >> m;
    int* l =new int[n];
    int* r = new int[n];
    int* pos = new int[n+2];
    for (int i = 0; i < n+2; i++)
    {
        *(pos+i) = 0;
    }
    for (int i = 0; i < n; i++)
    {
         cin >> *(l+i);
         cin >> *(r+i);
         for (int j = *(l+i); j <= *(r+i); j++)
         {
             *(pos+j) = 1;
         }
    }
    *(pos+0) = 1;
    *(pos+n + 1) = 1;
    while (true)
    {
        flag = 1;
        flag2 = 1;
        len = 0;
        loc = 0;
        for (int i = 0; i < n; i++)
        {
            if (*(pos+*(l+i)-1) == 0 && *(pos+*(r+i)+1)  == 0)
            {
                l[i]--;
                r[i]++;
                pos[l[i]] = 1;
                pos[r[i]] = 1;
                count++;
                flag = 0;
                flag2 = 0;
                break;
            }
            else if (*(pos + *(l + i) - 1) == 0 || *(pos + *(r + i) + 1) == 0)
            {
                if (*(r+i)-*(l+i)>len)
                {
                    loc = i;
                    len = *(r+i) - *(l+i);
                }
                flag2 = 0;
            }
        }
        if (flag)
        {
            (*(l+loc))--;
            (*(r+loc))++;
            count++;
            *(pos+*(l+loc)) = 1;
            *(pos+*(r+loc)) = 1;
        }
        if (flag2)
        {
            break;
        }
    }
    cout << count;
}


这里只需要找到断点在哪里就行了。
这题的思路是 给定一个数组,给所有的数组值初始化为0,然后给给定区间进行设置为1.
最后将断点拉伸就行了。
涉及到最小次数,那么需要找到是否能够凑一次拉两个空格。

直接上代码

#include <iostream>
#include <malloc.h>
using namespace std;
int main()
{
    int n = 0, m = 0;
    int min = 1;
    int count = 0;
    int loc,len,flag,flag2;
    cin >> n;
    cin >> m;
    int* l =new int[n];
    int* r = new int[n];
    int* pos = new int[n+2];
    for (int i = 0; i < n+2; i++)
    {
        *(pos+i) = 0;
    }
    for (int i = 0; i < n; i++)
    {
         cin >> *(l+i);
         cin >> *(r+i);
         for (int j = *(l+i); j <= *(r+i); j++)
         {
             *(pos+j) = 1;
         }
    }
    *(pos+0) = 1;
    *(pos+n + 1) = 1;
    while (true)
    {
        flag = 1;
        flag2 = 1;
        len = 0;
        loc = 0;
        for (int i = 0; i < n; i++)
        {
            if (*(pos+*(l+i)-1) == 0 && *(pos+*(r+i)+1)  == 0)
            {
                l[i]--;
                r[i]++;
                pos[l[i]] = 1;
                pos[r[i]] = 1;
                count++;
                flag = 0;
                flag2 = 0;
                break;
            }
            else if (*(pos + *(l + i) - 1) == 0 || *(pos + *(r + i) + 1) == 0)
            {
                if (*(r+i)-*(l+i)>len)
                {
                    loc = i;
                    len = *(r+i) - *(l+i);
                }
                flag2 = 0;
            }
        }
        if (flag)
        {
            (*(l+loc))--;
            (*(r+loc))++;
            count++;
            *(pos+*(l+loc)) = 1;
            *(pos+*(r+loc)) = 1;
        }
        if (flag2)
        {
            break;
        }
    }
    cout << count;
}