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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2011, 20:12   #1
Акоб
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 243
Радость Квадратная задача

Здравствуйте люди.Трудно себе представить квадратных людей.Но следущая задача утверждает, что они есть.Затрудняюсь обьяснить задачу и поэтому прошу прочитать ее здесь http://acm.timus.ru/problem.aspx?space=1&num=1073.
Код:
#include<iostream>
#include<cmath>


using namespace std;

int main()
{
	int N, j = 0, x = 0, d = 0;
        cin>>N;

	if( N < 0 || N > 60000 )
	{
		return 0;
		cout<<x;
	}

	if( N == 0 )
	{
		cout<<x;
		return 0;
	}
	while(N >= 0)
	{
															
		
		if( j * j >= N )
			{	
			if( j * j == N)
			{
				x++;
				cout<<x;
				return 0;
			}

			N = N - (j - 1) * (j - 1);
			j = 0;
			x++;
			continue;
		}
		j++;
	}
	cout<<x;
	return 0;
}
это код который написал я, но для некоторых чисел он показывает неправельний ответ.
181 = 10^2 + 9^2 ответ 2, а у меня показывает 5.
что я должен добавить или как должен написать код, чтобы он работал бы праеильно?
Заранее благодарен.
Акоб вне форума Ответить с цитированием
Старый 10.02.2011, 20:26   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Короче, я так понял, надо разложить число на минимальное число квадратов и вывести их количество.

Цитата:
if( N < 0 || N > 60000 )
{
return 0;
cout<<x;
}
По-хорошему, это ошибка. Во-первых, сначала cout, а потом return. Но вообще, тут правильней использовать следующее:
Код:
assert(N >= 0 && N <= 60000);
И лишние объявления (можно ведь их сделать позже).

Мне задача показалась интересной. Читать твой код дальше не стал и сделал сам... сейчас сделаю...

upd: блин, а ведь задача не так проста, как кажется. Вот например 381. Это 10^2 + 10^2 + 9^2. Тут или перебором надо, или рекурсией...

upd2: вот тебе: http://accepted.shoutwiki.com/wiki/%...quare_country)
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 10.02.2011 в 20:44.
Obey-Kun вне форума Ответить с цитированием
Старый 10.02.2011, 20:47   #3
Акоб
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 243
По умолчанию

На пребор времени нет.На время задачи дается 1 секунда.
вот и он
Код:
#include<stdio.h>

int i,j,k;
long int n;

int main()
{
           scanf("%d",&n);
           
           for(i=1;(i*i)<=n;i++) 
                               if((i*i)==n) 
                               {
                                            printf("%d",1); 
                                            return 0;
                               } 
           for(i=1;i*i<=n;i++)
           for(j=1;j*j<=n;j++) if((i*i+j*j)==n)
                               {
                                printf("%d",2); 
                                return 0;
                               } 
           
           for(i=1;i*i<=n;i++)
           for(j=1;j*j<=n;j++) 
           for(k=1;k*k<=n;k++) if((i*i+j*j+k*k)==n) 
                               {
                                printf("%d",3); 
                            
                                return 0;
                               }
           
           printf("%d",4); 
           return 0; 
   
    
}
Акоб вне форума Ответить с цитированием
Старый 10.02.2011, 20:49   #4
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Я тебе дал ссылку на решение. Суть такова: идём от 1 квадрика и считаем минимальное кол-во сертификатов.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 10.02.2011, 21:07   #5
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
Но вообще, тут правильней использовать следующее:
Код:
assert(N >= 0 && N <= 60000);
Не согласен, пользовательский ввод надо проверять всегда, assert в релизе (-DNDEBUG) не сработает.

Правильней
Код:
if(N<0 || N> 60000) {
  cerr << "Invalid input\n";
  return 1;
}
Д_М вне форума Ответить с цитированием
Старый 10.02.2011, 21:18   #6
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Правда ваша. Не отлаживаем же.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 10.02.2011, 21:56   #7
boomeer
Форумчанин
 
Аватар для boomeer
 
Регистрация: 04.08.2010
Сообщений: 110
По умолчанию

Динамика, решение за O(n*sqrt(n))
Вот мой код, но на яве. В обсуждении есть на плюсах.
Код:
import java.io.*;
import java.math.*;
import java.util.*;
import static java.lang.Math.*;

public class Timus_1073 implements Runnable {
	
	StreamTokenizer tok;
	BufferedReader in;
	PrintWriter out;
	boolean timus = System.getProperty("ONLINE_JUDGE") != null;
	
	void init() throws IOException {
		if (timus) {
			in = new BufferedReader(new InputStreamReader(System.in));
			tok = new StreamTokenizer(in);
			out = new PrintWriter(System.out);
		} else {
			in = new BufferedReader(new FileReader("input.txt"));
			tok = new StreamTokenizer(in);
			out = new PrintWriter("output.txt");
		}
	}
	
	int readInt() throws IOException {
		tok.nextToken();
		return (int) tok.nval;
	}
	
	String readString() throws IOException {
		tok.nextToken();
		return tok.sval;
	}
	
	public static void main(String[] args) {
		new Thread(new Timus_1073()).start();
	}
	
	@Override
	public void run() {
		try {
			if (timus) {
				init();
				solve();
				out.flush();
			} else {
				long t1 = System.currentTimeMillis();
				init();
				solve();
				out.close();
				long t2 = System.currentTimeMillis();
				System.out.println(t2 - t1);
			}
		} catch(IOException e) {
			System.exit(1);
		}
	}
	
	void solve() throws IOException {
		int n = readInt();
		int[] d = new int[n + 1];
		Arrays.fill(d, Integer.MAX_VALUE / 3);
		d[0] = 0;
		for (int k = 1; k * k <= n; k++) {
			for (int i = k * k; i <= n; i++) {
				d[i] = min(d[i], d[i - k * k] + 1);
			}
		}
		out.println(d[n]);
	}
	
}
Акоб, какой ник? На тимусе
boomeer вне форума Ответить с цитированием
Старый 11.02.2011, 18:36   #8
Акоб
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 243
По умолчанию

Ten**
что-то большой код.
обьясни как ты зделал.
Акоб вне форума Ответить с цитированием
Старый 11.02.2011, 20:54   #9
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

а если взять корень от этого числа, отбросить дробную часть, вычесть, взять корень, отбросить дробную часть - и так пока не будет минимума ?
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 11.02.2011, 22:34   #10
Акоб
Форумчанин
 
Регистрация: 10.01.2011
Сообщений: 243
По умолчанию

sqt(181) = 13
sqrt(13) = 3
sqrt(3) = 1
так?
правельный ответ 2
Акоб вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Квадратная матрица Muratik Общие вопросы C/C++ 3 26.12.2010 22:57
квадратная матрица Di-em Общие вопросы C/C++ 6 09.12.2010 19:11
квадратная матрица remember me Помощь студентам 2 08.12.2010 16:41
Квадратная матрица arhan Общие вопросы Delphi 3 22.06.2010 09:44
Pascal, задача квадратная матрица+процедура Antowka Помощь студентам 6 13.11.2008 16:52