Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2010, 21:56   #11
vanyasmart
 
Регистрация: 01.12.2010
Сообщений: 4
По умолчанию

Блин. Зашел в нет посмотреть правильный ответ к этой задачи, нашел этот форум и не удержался, чтобы не ответить.

Правильный ответ 55251. Но если считать билет с номером - 000 000, то ответ - 55252.

Вот решение придуманное моим другом во время участия в одной олимпиаде:

Цитата:
var
M:array [0..27] of Word;
I,J,K:Byte;
S:Word;
begin
FillChar(M,SizeOf(M),0);
S:=0;
for I:=0 to 9 do
for J:=0 to 9 do
for K:=0 to 9 do
Inc(M[I+J+K]);
for I:=0 to 27 do
S:=S+M[I]*M[I];
Writeln('S=',S);
Readln
end.
У меня другой вариант, но он сейчас не на компе с которого я пишу. Выложу потом.


Мой вариант собснноговоря (2 цикла по 999 итераций + массив из 27 элементов):
Цитата:
#include<conio.h>
#include<iostream>

int main(void)
{
/* Вариант 1 */

/* int arr[27],k=0;
for(int i=0;i<27;++i)arr[i]=0;

for(int i=1;i<=999;++i)++arr[i/100+i%100/10+i%10-1];
for(int i=1;i<=999;++i)k+=arr[i/100+i%100/10+i%10-1];*/


/* Вариант 2 */

int arr[28],k=0;
for(int i=0;i<28;++i)arr[i]=0;

for(int i=0;i<=9;++i)for(int j=0;j<=9;++j)for(int l=0;l<=9;++l)++arr[i+j+l];
arr[0]=0;
for(int i=0;i<=9;++i)for(int j=0;j<=9;++j)for(int l=0;l<=9;++l)k+=arr[i+j+l];
std::cout<<k;
getch();
return 0;
}

Последний раз редактировалось vanyasmart; 02.12.2010 в 14:02.
vanyasmart вне форума Ответить с цитированием
Старый 01.12.2010, 23:49   #12
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <conio.h> // clrscr();
//---------------------------------------------------------------------------
int CheckLuckTickLoop(LARGE_INTEGER &iDifTime);
int CheckLuckTickCombinatorics(LARGE_INTEGER &iDifTime);
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Решение в лоб: 1'000'000 итераций.
//---------------------------------------------------------------------------
int CheckLuckTickLoop(LARGE_INTEGER &iDifTime)
{
	int iResult = 0;
	// ----
	int d1, d2, d3, d4, d5, d6;
	// ----
	LARGE_INTEGER iStart, iStop;
	QueryPerformanceCounter(&iStart);
	// ----
	for(d1 = 0; d1 <= 9; d1++)
		for(d2 = 0; d2 <= 9; d2++)
			for(d3 = 0; d3 <= 9; d3++)
				for(d4 = 0; d4 <= 9; d4++)
					for(d5 = 0; d5 <= 9; d5++)
						for(d6 = 0; d6 <= 9; d6++)
							if(d1 + d2 + d3 == d4 + d5 + d6) iResult++;
	// ----
	QueryPerformanceCounter(&iStop);
	iDifTime.QuadPart = iStop.QuadPart - iStart.QuadPart;
	// ----
	return iResult;
}
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// Решение через комбинаторику: 1'000 итераций. (Оптимизация в 1'000 раз)
//---------------------------------------------------------------------------
int CheckLuckTickCombinatorics(LARGE_INTEGER &iDifTime)
{
	int iResult = 0;
	// ----
	int i, j, z;
	byte buf[28];
	memset(&buf, 0, sizeof(buf));
	// ----
	LARGE_INTEGER iStart, iStop;
	QueryPerformanceCounter(&iStart);
	// ----
	for(i = 0; i <= 9; i++)
		for(j = 0; j <= 9; j++)
			for(z = 0; z <= 9; z++)
				buf[i + j + z] += 1;
	// ----
	for(i = 0; i < 28; i++) iResult += buf[i] * buf[i];
	// ----
	QueryPerformanceCounter(&iStop);
	iDifTime.QuadPart = iStop.QuadPart - iStart.QuadPart;
	// ----
	return iResult;
}
//---------------------------------------------------------------------------

void main()
{
	clrscr();
	// ----
	int iRes = 0;
	LARGE_INTEGER iDifTime;
	// ----
	iRes = CheckLuckTickLoop(iDifTime);
	printf("\CheckLuckTickLoop = %d; Time: %d\n\n", iRes, iDifTime);
	// ----
	iRes = CheckLuckTickCombinatorics(iDifTime);
	printf("\CheckLuckTickCombinatorics = %d; Time: %d\n\n", iRes, iDifTime);
	// ----
	system("Pause");
}
//---------------------------------------------------------------------------
Credit: S@nek
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
"Транспортная задача", "Поиск решения" Perroman Microsoft Office Excel 3 12.12.2007 17:12
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49