kiem tien, kiem tien online, kiem tien truc tuyen, kiem tien tren mang
Friday, November 11, 2011

Suu tam:


Một đoạn số có tổng bằng nhau trong một dãy số là một nhóm các số theo đúng thứ tự ban đầu trong dãy mà nếu nhóm với nhau thì sẽ cho ra cùng một giá trị tổng. Ví dụ với dãy: 2 5 1 3 3 7 thì ta có thể nhóm thành: (2 5) (1 3 3) (7) cùng cho giá trị tổng là 7.
Chú ý: đoạn đặc biệt chứa tất cả các phần tử của dãy cũng được coi là một đoạn có tổng bằng nhau với chính giá trị tổng các số của dãy đó.
Yêu cầu: viết chương trình nhận vào các dãy số nguyên dương và trả về giá trị tổng nhỏ nhất có thể của một đoạn tổng bằng nhau trong dãy.
Dữ liệu vào
Dòng đầu tiên chứa một số nguyên 1 ≤ t ≤ 1000 là số lượng bộ test. Mỗi bộ test bao gồm:
  • Dòng đầu tiên chứa thứ tự bộ test và số M (1≤ M ≤ 10000) là số phần tử của dãy.
  • Các dòng tiếp theo mỗi dòng ghi 10 số của dãy phân cách bởi 1 dấu cách. Dòng cuối cùng có thể có ít hơn 10 số.  (Các số trong dãy đều nhỏ hơn 20000).
Dữ liệu ra
Với mỗi bộ test, in ra trên một dòng gồm số thứ tự bộ test và tổng nhỏ nhất có thể đạt được của các đoạn số có tổng bằng nhau. 

Example




INPUT
OUTPUT


3
1 6
2 5 1 3 3 7
2 6
1 2 3 4 5 6
3 20
1 1 2 1 1 2 1 1 2 1
1 2 1 1 2 1 1 2 1 1
1 7
2 21
3 2




#include<iostream>
using namespace std;

int tong, a[10002],M;
void Init()
{
int h;cin>>h;
tong = 0;
cin>>M;
for( int i =1;i<=M;i++)
{
cin>>a[i];
tong +=a[i];
}

//cout<< "tong ="<< tong<< endl;

}

int test()
{

int k, t;
if( tong%2) k =2;
else k =1;
for( int i=1;i< tong;i+=k)
if(tong%i == 0){

t =0;
for(int j=1;j<=M;j++)
{
t+= a[j];
if( t< i) continue;
else
{
if(t > i)break;
else
{
t =0;
if( j == M)return(i);
}
}
}
}

return tong;



}



int main()
{
int slg;
cin>>slg;
for(int i=1;i<=slg;i++)
{
Init();

cout<<i<<" "<<test()<<endl;
}

//system("pause");
return 0;
}


















0 comments:

Post a Comment

domain, domain name, premium domain name for sales

Popular Posts