日用品網(wǎng)站1萬2做代理網(wǎng)絡(luò)營銷大賽策劃書
題目描述:
X星球的某個大獎賽設(shè)了 M 級獎勵。每個級別的獎金是一個正整數(shù)。
并且,相鄰的兩個級別間的比例是個固定值。
也就是說:所有級別的獎金數(shù)構(gòu)成了一個等比數(shù)列。
比如:16,24,36,54,其等比值為:3/2。
現(xiàn)在,我們隨機(jī)調(diào)查了一些獲獎?wù)叩莫劷饠?shù)。
請你據(jù)此推算可能的最大的等比值。
輸入格式:
第一行為數(shù)字 N ,表示接下的一行包含 N 個正整數(shù)。第二行 N 個正整數(shù) Xi,用空格分開,每個整數(shù)表示調(diào)查到的某人的獎金數(shù)額。
輸出格式:
一個形如 A/B 的分?jǐn)?shù),要求 A、B 互質(zhì),表示可能的最大比例系數(shù)。數(shù)據(jù)范圍:
0<N<100
0<Xi<10^9
數(shù)據(jù)保證一定有解。輸入樣例1:
3
1250 200 32
輸出樣例1:
25/4
這道題,做的時候可以氣死我,為什么呢?首先我覺得它的范圍有問題,就是這里的Xi它說小于10的九次方,所以用int也不會超的吧,沒想到他還真超了呢,我看了很多遍代碼,都沒看見什么乘法和加法能讓一個數(shù)超int的,然后我去看別人的博客,發(fā)現(xiàn),XX的,別的博客給的Xi范圍是10^12,不會藍(lán)橋云課刷題那里寫少了吧,氣死我了,我真的真的改了很久的代碼!!!!!
然后第二個氣人的點是,這道題沒卡測試點,所以直接用gcd求出相鄰兩數(shù)的互質(zhì)比值,找出整個范圍最小的那個就可以了,這樣好像也可以過,不過怎么會這樣子,比如說三個獎勵1 4 32,最大合適的比例應(yīng)該是2/1,而不是4/1,我看見有個人的代碼,結(jié)果是4/1也能對,就是好像藍(lán)橋云課刷題那里拿的測試點太低端了,卡不了代碼,氣死我了!!!!!測試點都不好好弄一下
接下來說思路:要想找到最小比例,得用指數(shù)的更相減損術(shù),可以看一下另一個博客:
http://t.csdnimg.cn/NPZtY
有了這個,代碼就好寫了,哦對,記得審題,題目可能有重復(fù)的獎金,因為有不同的人可能拿同一類獎金,這個要篩掉,不然會出問題的!!!!
ac代碼如下:
#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
#define ll long long
ll x[N],temp[N];
ll a,b;
ll gcd_sub(ll x1,ll x2) { if(x1<x2)swap(x1,x2);//保證x1比x2大 if(x2==1)return x1;return gcd_sub(x2,x1/x2);
}
int main() {int n;cin>>n;for(int i=0; i<n; i++)cin>>temp[i];int len=0;sort(temp,temp+n);x[len++]=temp[0];for(int i=1;i<n;i++){if(temp[i]!=temp[i-1])x[len++]=temp[i];}if(len==1) {printf("%ld/1",x[0]);} else {a=x[1]/__gcd(x[0],x[1]),b=x[0]/__gcd(x[0],x[1]);for(int i=2; i<len; i++) {ll d=__gcd(x[i],x[i-1]);a=gcd_sub(a,x[i]/d);b=gcd_sub(b,x[i-1]/d);}printf("%ld/%ld",a,b);}return 0;
}