Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
这样的思路有什么错?让周期时间d[i]从小到大排序,周期时间相同的合并成一个点,最后还剩N个两两周期不同的行星。 那么相邻两个行星的产生半圈的距离差所需时间为T[i] = d[i]*d[i+1] / (d[i+1]-d[i])*2; 这样就可以产生N-1个T[i],求出这个N-1个T[i-1]的最小公倍数。 就这样是在想不出那里有错,谁能指出来思路哪里错了。 我的代码: #include <iostream> #include <algorithm> using namespace std; struct Data { int numerator ,denominator ; }; int d[1001],n,N; int T[1001]; Data dp[1001]; int gcd(int a, int b) { int tmp; if(a<b) { tmp = a; a= b; b= tmp; } while(true){ if(a%b ==0) break; tmp =a%b; a = b; b = tmp; } return b; } int mul(int a, int b) { int g = gcd(a,b); b = b/g; return a*b; } void Mylest(int n1, int d1, int n2, int d2, int &rstN, int &rstD) { rstN = mul(n1,n2); rstD = gcd(d1,d2); } void work(int i) { dp[i].numerator = T[i]*T[i+1]; dp[i].denominator = (T[i+1]-T[i])*2; int g = gcd(dp[i].denominator,dp[i].numerator); dp[i].numerator = dp[i].numerator/g; dp[i].denominator=dp[i].denominator/g; } int main() { //freopen("C:\\ACMData.txt","r",stdin); scanf("%d",&n); int i=0; while(i<n){ scanf("%d",&d[i]); i++; } sort(d,d+n); N=0; i=0; T[N] = d[i]; i++;N++; while( i<n){ if( d[i] == d[i-1]){ i++; continue; } else{ T[N] = d[i]; N++; i++; } } i=0; while(i<N-1){ work(i); i++; } //算法应该没错,难道是哪里没想到!!!! int numerator = dp[0].numerator; int denominator = dp[0].denominator; i=1; //N个有效点 那么就只有N-1个相邻“最小半圈时间差” while(i<N-1) //Çó×îС¹«±¶Êý { Mylest(numerator,denominator,dp[i].numerator,dp[i].denominator,numerator,denominator); i++; } int g= gcd(numerator,denominator); numerator = numerator/g; denominator=denominator/g; printf("%d %d\n",numerator,denominator); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator