vijos leave-绿光

Leave-绿光

背景

期待这一份幸运,和一份冲劲,多么奇妙的际遇……。燕姿在演唱完绿光这首歌后,出给了姿迷一个考题。

北欧有一个传说!
人一生中能看见绿光!
他就一生都可以得到幸福!

描述

燕姿唱完这首歌,天上降落了一道绿光,在地上形成了一个矩形的映射,矩形的长为a,宽为b。燕姿向姿迷出了一个考题,谁能够把这个矩形绿光阵分成若干个正整数的正方形,谁的正方形边长之和最小,他就将得到燕姿的一个合影。姿迷们都很想得到合影,可是怎么分才最小呢?大家都束手无策,现在,这个问题交给你了。

歌迷X:呜呜呜,俺的语文不好,听不懂你在讲什么。

燕姿:别怕,其实这个问题可以简化为……

将边长为正整数a,b的长方形划分成若干边长均为正整数,每个正方形的边均平行于矩形的相应边,试求这些正方形边之和的最小值MIN。

(如果这个长方形可以分成N个正方形,其中每个边长为Ai,那么MIN=A1+A2+^^^+AN
注意,数组A中的元素可能相等)

格式

输入格式

一共10行
每行两个正整数,Ai,Bi

对于30%的数据,Ai,Bi<maxint
对于100%的数据,Ai,Bi<maxlongint;

输出格式

一共10行
每行一个整数,输出MINi

样例1

样例输入1

1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1

样例输出1

1
2
3
4
5
6
7
8
9
10

限制

每点1s

提示

对于样例,可全分长边长为一的正方形,并且可以证明找不到比其更优的分割方法;
加油吧,为了得到燕姿的合影(#17)

来源

孙燕姿
图片

 
 
思路:不断地求可取的最大的正方形   就是gcd
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 long long int l,w,ans;
 5 int main()
 6 {
 7     for(int i=1;i<=10;i++)
 8     {
 9         ans=0;
10         cin>>l>>w;
11         if(l<w) swap(l,w);
12         if(w==1)
13         {
14             cout<<l*w<<endl;
15             continue;
16         }
17         while(l!=w)
18         {
19             if(l<w) swap(l,w);
20             ans+=l/w*w;
21             l=l%w;
22             if(l==0||w==0)   break;
23         }
24         ans+=l;
25         cout<<ans<<endl;
26      } 
27     
28     return 0;
29 }
View Code
原文地址:https://www.cnblogs.com/chen74123/p/7339357.html