新聞中心
4.3 提升題 - B Distance of Triples
原題目為英文,不好看,我放翻譯過的.
題意:根據(jù)谷歌翻譯:給定(自己輸入)三個集合s1,s2,s3,定義D(a,b,c)=|a-b|+|b-c|+|c-a|,
假設(shè)其中a,b,c分別來自三個集合s1,s2,s3,求出使D最小且三元組(a,b,c)大的a,b,c的值和對應(yīng)的D。
思路:在數(shù)軸上點(diǎn)出幾個個任意點(diǎn)a,b,c,a1,a2,c1,c2如下
—a1——————a——————a2———————b————c2———c—————c1——
假設(shè)它們的關(guān)系如上,考慮某一個b。容易發(fā)現(xiàn),中間的b只要在a和c之間移動,不改變D的大小,所以我們只需要考慮a和c即可。如果a→a1或c→c1,D變大,只有a和c在數(shù)軸上向b靠攏,且不越過b才會使D變小。故有一個思路如下:
思路一、找到元素最少的數(shù)組(這一部我實(shí)現(xiàn)起來有點(diǎn)麻煩,就不搞了),假設(shè)為s2,把s1和s2排序,固定b,找到b在s1和s2中的位置,以便找到數(shù)軸上距離b最近的a和c,這樣處理s2中每一個b,比較一下D(a,b,c)即可。
因?yàn)樵谧龅耐局形艺业搅宋宜悸返膯栴},有可能對某個b在s1和s3中找不到比b大或小的數(shù);
而且寫好的程序錯誤也很多,就沒做了,過幾日看懂了標(biāo)答再補(bǔ)發(fā),最近在預(yù)習(xí)數(shù)據(jù)結(jié)構(gòu)和學(xué)習(xí)遞歸函數(shù)
//根據(jù)谷歌翻譯:給定數(shù)集 s1,s2,s3,要求(a∈s1,b∈s2,c∈s3)|a?b|+|b?c|+|c?a|的最小值,|s1,s2,s3|≤10^4
#include
#include
#include
#define max 10000
int Dis(int a,int b,int c)
{
? return abs(a-b)+abs(b-c)+abs(a-c);
}
int find(int arr[],int x,int len)//尋找x在數(shù)組arr中的位置(分別傳入數(shù)組,待查找的值,數(shù)組長度)
{
? int a, b, c;
? a = 0, c = len;
? while (1)
? {
? b = (a + c) / 2;
? if (x == arr[b] || abs(a - c) == 1) return b;
? else if (x >arr[b]) a = b;
? else if (x< arr[b]) c = b;
? }
}
void swap(int* a, int* b)
{
? int temp = *a;
? *a = *b;
? *b = temp;
}
void func(int arr[], int len)//選擇排序,升序
{
? int i, j;
? for (i = 0; i< len - 1; i++)
? {
? int min = i;
? for (j = i + 1; j< len; j++)
? if (arr[j]< arr[min])
? min = j;
? swap(&arr[min], &arr[i]);
? }
}
int main()
{
? char check=0;
? int i=0,j=0,n1,n2,n3,s1[max]={0},s2[max]={0},s3[max]={0},a,b,c,D,a2,b2,c2;
? scanf("%d %d %d",&n1,&n2,&n3);
?while (check != '\n')
?{
??? ?scanf("%d", &s1[i++]);
??? ?check = getchar();
?}
? check=0,i=0;
?while (check != '\n')
?{
??? ?scanf("%d", &s2[i++]);
??? ?check = getchar();
?}
? check=0,i=0;
?while (check != '\n')
?{
??? ?scanf("%d", &s3[i++]);
??? ?check = getchar();
?}
? //固定s2,把s1和s3排序,選擇比b小的a比b大的c
? func(s1,strlen(s1));
? func(s3,strlen(s3));
? //假設(shè)第一個b是要求答案
? b=s2[0];
? n3=find(s3,b,strlen(s3));
? a=s1[n3];
? if(s3[n3]==b||n3==strlen(s3)) c=b;
? else c=s3[n3+1];
? D=Dis(a,b,c);
? for(i=1;i
? b2=s2[i];
? n3=find(s3,b2,strlen(s3));
? a2=s1[n3];
? if(s3[n3]==b2||n3==strlen(s3)) c2=b2;
? else c2=s3[n3+1];
? if(D>Dis(a2,b2,c2))
?{
?a=a2,b=b2,c=c2;
?}
? }
? printf("MinD(%d,%d,%d)=%d",a,b,c,D);
? return 0;
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
本文名稱:每日一題(有點(diǎn)難2022/11/30)12/3-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://www.dlmjj.cn/article/dijops.html