Kanishk Agrawal Ответов: 3

Как вывести числа, сумма которых равна максимальной сумме


In the XYZ society, the neighbours hate each other for their attitude. Various activities are organized in the society for Welcoming the New Year. The tickets were provided to each house with an integer written on it. Some got tickets with positive integers and some got tickets with negative integers. In the evening, people had to carry their tickets to the club house where the eligible ones will get the exciting gifts. The eligibility of winning the gift depends on the maximum sum which can be formed from the tickets numbers keeping in mind that neighbours hate each other. Since the neighbours hate each other, the two cannot be together in the list of maximum sum.



Президент общества, мистер Сингх, мудрый человек и знает, что соседи в обществе не любят друг друга. Кроме того, он не хочет становиться плохим перед людьми. Поэтому ему пришла в голову идея разработать программу, которая будет предоставлять список целых чисел, образующих максимальную сумму, и таким образом всем членам списка будут даны подарки. Единственная проблема с этой идеей заключается в том, что он не знает программирования, поэтому он просит вас предоставить правильный список целых чисел. Люди могут быть раздражающими, но умными и будут бороться, если список, предоставленный вами, не образует максимальную сумму.

Примечание: целое число, записанное на билете физических лиц, может быть уникальным, а может и не быть. В случае, когда существует два списка с равной максимальной суммой, будет рассматриваться список с первым большим элементом. Для лучшего понимания обратитесь к объяснению тестового случая 4 в примере тестового случая. Билеты с целым числом 0 не считаются выигрышными подарками.


входной формат
Первая строка входных данных состоит из числа тестовых случаев, т.
Первая строка каждого тестового случая состоит из числа домов (билетов, распределенных) в обществе, N.
Вторая строка каждого тестового случая состоит из N разделенных пробелами билетов с написанным на них целым числом.



Ограничения
1<= T <=10
1<= N <=10000
-1000<= Integer_on_Ticket <=1000


выходной формат
Для каждого тестового случая выведите номера билетов в одну строку, образуя максимальную сумму в формате, аналогичном образцу тестового случая.

Что я уже пробовал:

#include<iostream>

using namespace std;

void maxsum(int a[], int n);
int maxi(int a, int b);
int main()
{
   int t,n,i,j;
   
   cin>>t;
   
   while(t--)
   {
   	cin>>n;
   	
   	int a[n];
   	
   	for(i=0; i<n; i++)
   	cin>>a[i];
   	
   	maxsum(a,n);
   }

	
	return 0;
}
void maxsum(int a[], int n)
{
	int m[n],max=0,i,x[n],c=0;
	
	for(i=0; i<n; i++)
	x[i]=0;
	
	if(a[0]>0)
	m[0]=a[0];
	else
	m[0]=0;
	
	m[1]= maxi(a[1],a[0]);
	
	for(i=2; i<n; i++)
	{
		m[i]= maxi(m[i-1], m[i-2]+a[i]);
		
		max=m[i];
		
		if(max == m[i-1])
		{
			x[c]=i-1;
			c++;
		}
		else
		{
			x[c++]=i-2;
			x[c++]=i;
		}
		
	}
	
	//for(i=0; i<n; i++)
	//{
	//	if(max<m[i])
	//	max=m[i];
	//}
	//return max;
	
	for(int j=c; j>0; j--)
	{
		if(x[j]!=0)
		cout<<a[x[j]];
	}

}
int maxi(int a, int b)
{
	return (a>b?a:b);
}

phil.o

И в чем же заключается ваш вопрос?

Rick York

Вы должны научиться работать с файлами. Гораздо проще ввести тестовые данные в несколько файлов один раз, чем вводить их каждый раз.

3 Ответов

Рейтинг:
0

Patrice T

Цитата:
Как вывести числа, сумма которых равна максимальной сумме

Проблема типична для сайтов с вызовами, по определению, эти вызовы сложны. Цель всегда состоит в том, чтобы создать определенный алгоритм, который решит проблему.
Это задание, данное вам вами, вся цель состоит в том, чтобы знать, можете ли вы решить его или нет.
И, очевидно, вы потерпите неудачу.

К сожалению, решение проблемы за вас никогда не поможет вашим навыкам решать другие проблемы. Ваши неудачи просто говорят о том, что вам нужно изучать алгоритмы и практиковаться.


Рейтинг:
0

Member 10251867

static int maxSubArraySum(int[] a, out List<int> res)
      {
          int size = a.Length;

          int max_so_far = 0, max_ending_here = 0;
          List<int> elements = new List<int>();

          for (int i = 0; i < size; i++)
          {
              max_ending_here = max_ending_here + a[i];
              if (a[i] > 0)
                  elements.Add(a[i]);

              if (max_ending_here < 0)
                  max_ending_here = 0;

              /* Do not compare for all elements. Compare only  when max_ending_here > 0 */
              else if (max_so_far < max_ending_here)
                  max_so_far = max_ending_here;
          }
          res = elements;
          return max_so_far;
      }
      public static void calculate()
      {
          try
          {
              int T = Convert.ToInt32(Console.ReadLine());
              if (T < 1 || T > 10) return;

              List<int> tickets = new List<int>();

              List<string> res = new List<string>();

              for (int loop = 0; loop < T; loop++)
              {
                  int count = Convert.ToInt32(Console.ReadLine());
                  if (count < 1 || count > 10000) continue;

                  tickets = Console.ReadLine().Split(' ').ToList().Where(x => !string.IsNullOrEmpty(x)).Select(x => Convert.ToInt32(x)).ToList();
                  if (tickets.Any(x => x < -1000 || x > 1000)) continue;

                  var evens = tickets.Where((s, i) => i % 2 == 0).ToArray();
                  var odds = tickets.Where((s, i) => i % 2 != 0).ToArray();

                  List<int> resEven = new List<int>();
                  List<int> resodd = new List<int>();

                  var resEvenSum = maxSubArraySum(evens, out resEven);
                  var resOddSum = maxSubArraySum(odds, out resodd);
                  var resR = "";

                  if (resEvenSum >= resOddSum)
                  {
                      for (int i = resEven.Count - 1; i >= 0; i--)
                      {
                          resR += resEven[i].ToString();
                      }
                  }
                  else if (resEvenSum < resOddSum)
                  {
                      for (int i = resodd.Count - 1; i >= 0; i--)
                      {
                          resR += resodd[i].ToString();
                      }
                  }

                  res.Add(resR);
              }
              for (int loop = 0; loop < res.Count; loop++)
              {
                  Console.WriteLine(res[loop].ToString().ToCharArray().Reverse().ToString());
              }

          }
          catch (Exception ex) { Console.Write(ex.Message + ex.StackTrace); }
      }


Richard MacCutchan

То есть C#, вопрос помечен тегом C++.

Рейтинг:
0

komalA18

 <pre>//sum of maximum neighburs
#include<iostream>
using namespace std;
void ins_Array(int Integer_on_Ticket[],int n)
{
 for(int i=0;i<n;i++)
    {
        cin>>Integer_on_Ticket[i];
        while(Integer_on_Ticket[i]<(-1000) || Integer_on_Ticket[i]>1000)
        {
            cout<<"enter again";
             cin>>Integer_on_Ticket[i];
        }
    }
}
int check(int Integer_on_Ticket[],int s[],int n)
{
    int m,k=0;
    for(int i=0;i<(n-2);i++)
    {
        for(int j=(i+2);j<n;j++)
        {
            s[k]=Integer_on_Ticket[i]+Integer_on_Ticket[j];
            if(s[k]<Integer_on_Ticket[i])
            {
                s[k]=Integer_on_Ticket[i];
            }
            k++;
        }
    }
    return k;
}
int sum(int Integer_on_Ticket[],int s[],int n,int k)
{
    int ma;
    ma=s[0];
    for(int i=0;i<k;i++)
    {
        if(ma<s[i])
        {
            ma=s[i];
        }
    }
    return ma;
}
int maxv(int Integer_on_Ticket[],int s[],int ma,int n,int k)
{
    int ans,f=0,p=0,r,t;
    for(int i=0;i<(n-2);i++)
    {
        for(int j=(i+2);j<n;j++)
        {
            ans=Integer_on_Ticket[i]+Integer_on_Ticket[j];
            if(ans==ma)
            {
                if(p==0)
                {
                //cout<<Integer_on_Ticket[j]<<Integer_on_Ticket[i]<<endl;
                r=i;
                t=j;
                f=1;
                p=1;
                }
                else if(p==1)
                {
                    if(Integer_on_Ticket[r]<Integer_on_Ticket[i])
                    {
                        r=i;
                        t=j;
                    }
                }
            }
        }
    }
    if(f==1)
    {
        cout<<Integer_on_Ticket[t]<<Integer_on_Ticket[r]<<endl;
    }
    return f;
}
int main()
{
    int n,Integer_on_Ticket[200],s[200],k,T;
    cout<<"enter no of test cases";
    cin>>T;
    while(T--)
    {
    cout<<"enter n";
    cin>>n;
    while(n<1 || n>1000)
    {
          cout<<"enter n";
          cin>>n;
    }
    ins_Array(Integer_on_Ticket,n);
    if(n==1)
    {
        cout<<Integer_on_Ticket[0];
    }
    else if(n==2)
    {
        cout<<"As neighbours hate each other";
    }
    else
    {
    k=check(Integer_on_Ticket,s,n);
    int ma=sum(Integer_on_Ticket,s,n,k);
    int j=maxv(Integer_on_Ticket,s,ma,n,k);
    if(j==0)
    {
        cout<<ma;
    }
    }
    }
    return 0;
}