| ||||||||||
| 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 | |||||||||
说一下贪心法的策略两个数
后一个减前一个
奇数
选最小的非0数字做m的第一位,然后把剩下的数字从小到大依次做m的后面几位,从大到小做n
偶数
选最小的不包括0的绝对值距离最小的两个数,大数做m的第一位,小数做n的第一位,剩下的数字按照奇数剩下的一样的做法,如果存在多组距离最小且一样,选取离中心线最近的左右两组中结果比较小的那组,因为从左向右,先是m的后面几位变小,n的后面几位不变,后是n的后面几位变小,m的后面几位不变
附代码,和暴搜比较过所有1024种情况,应该没问题
//input A[10], N
int solve2()
{
if (N == 2) {
return A[1]-A[0];
} else if (N % 2) {
if (A[0] == 0) {
int tmp = A[1];
A[1] = A[0];
A[0] = tmp;
}
A[1] += A[0]*10;
int ans = 0;
for (int i = 1; i <= N/2; i++) {
ans *= 10;
ans += (A[i]-A[N-i]);
}
return ans;
} else {
int ival[10]; //interval
int ST = 0; //start
if (A[ST] == 0)
ST++;
for (int i = ST; i+1 < N; i++)
ival[i] = A[i+1]-A[i];
int min1 = INF, pos1, min2 = INF, pos2;
for (int i = ST; i < N/2; i++) {
if (ival[i] <= min1) {
min1 = ival[i];
pos1 = i;
}
}
for (int i = N-2; i >= (N/2)-1; i--) {
if (ival[i] <= min2) {
min2 = ival[i];
pos2 = i;
}
}
int A2[10];
for (int i = 0; i < N; i++)
A2[i] = A[i];
int ans1 = 0;
int tmp1 = A[pos1+1], tmp2 = A[pos1];
for (int i = pos1; i > 0; i--)
A[i] = A[i-1];
for (int i = pos1+1; i < N-1; i++)
A[i] = A[i+1];
A[0] = tmp1;
A[N-1] = tmp2;
for (int i = 0; i < N/2; i++) {
ans1 *= 10;
ans1 += (A[i]-A[N-1-i]);
}
int ans2 = 0;
tmp1 = A2[pos2+1], tmp2 = A2[pos2];
for (int i = pos2; i > 0; i--)
A2[i] = A2[i-1];
for (int i = pos2+1; i < N-1; i++)
A2[i] = A2[i+1];
A2[0] = tmp1;
A2[N-1] = tmp2;
for (int i = 0; i < N/2; i++) {
ans2 *= 10;
ans2 += (A2[i]-A2[N-1-i]);
}
return ((ans1 > ans2) ? ans2 : ans1);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator