2020年百度之星程式設計大賽-初賽二

Charzueus發表於2020-07-25

2020年百度之星程式設計大賽-初賽二前兩題解答程式碼思路
Poker

Problem Description
小沃沃在玩一個有趣的遊戲。
初始他有 n 塊錢,每一輪他需要投入至少 m 塊錢,系統會拿走其中 p% 的錢,並把剩下的錢還給他。
請問在最優情況下,小沃沃最多可以玩多少輪?
假設當前一輪小沃沃投入了 x 塊錢,那麼他可以收回 ⌊x*(1−p%)⌋ 塊錢,其中⌊a⌋ 表示 a 取下整。 小沃沃每一輪投入的錢不能超過他現在擁有的錢。
每一輪投入的錢必須為整數。

Input
第一行一個正整數 test(1≤test≤100000) 表示資料組數。
對於每組資料,一行三個整數 n,m,p(1≤n≤100000,1≤m≤1000,1≤p≤100)。
Output
對每組資料輸出一行一個整數表示答案。

Sample Input

2

10 50

10 100

Sample Output

9

5

 

這道題比較簡單,第一次提交遇到超時問題,後來使用了scanf和printf解決問題。

Accept程式碼:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int test,n,m,sum;
    float p;
    cin>>test;
    while(test--)
    {
        
        scanf("%d%d%f",&n,&m,&p);//cin和cout會超時 
        int r=n,nums=0;
        while(r>=m)
        { 
            nums++;
            r=r-m*p*0.01;
        }
        printf("%d\n",nums); 
    }
    return 0;
} 

目前官方提示: 觀察到小沃沃每次只會投入 m 塊錢,當他手上的錢大於等於 m 時,他可以繼續玩,每次會被拿走⌈m∗p%⌉ 這麼多錢。那麼就很好算了。

Distance

Problem Description
小沃沃所在的世界是一個二維平面。他有 nn 個朋友,第 ii 個朋友距離他的距離為 a[i],小沃沃並不知道這些朋友具體在什麼點上。
請問在最優情況下,小沃沃的朋友兩兩之間的歐幾里得距離的和的最小值是幾?
假設小沃沃的位置為 P_0 = (x_0,y_0),第 i 個朋友的位置為 P_i = (x_i,y_i),對於所有的 i,需要滿足 dist(P_0, P_i) = a[i],並且∑ i=1 n−1∑ j=i+1 n dist(Pi,Pj) 最小,其中 dist(X,Y)dist(X,Y) 為連線點 XX 和點 YY 的線段的長度。x_i,y_i都可以是任意實數。

Input
第一行一個正整數 test(1≤test≤10) 表示資料組數。
對於每組資料,第一行一個正整數 n(1≤n≤100000)。
接下來一行 n 個整數,第 i 個整數 a[i] (1≤a[i]≤1000000000) 表示第 i 個朋友和小沃沃的距離。
Output
對每組資料輸出一行一個數,表示∑ i=1 n−1∑ j=i+1 ndist(Pi,P j) 的最小值。答案需要四捨五入到整數。

Sample Input
2
2
3 5
5
1 2 3 4 5
Sample Output
2
20

這道題目也好理解,寫程式思路直接,只是又遇到了超時問題。

#include<bits/stdc++.h>
#include<cstdlib>
using namespace std;
//int a[1000000005];//陣列太大,會出錯 
int *a = new int[1000000005];//全域性變數動態分配 
int main()
{
    int test,n,i,j;
    scanf("%d",&test);
    while(test--)
    {    
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int sum=0;
        sort(a+1,a+n+1);//排序
        i=1;
        while(i<=n-1)
//        for(i=1;i<=n-1;i++)//時間複雜度O(n^2),超時
        {
            j=i+1;
            for(j=i+1;j<=n;j++)
            {
                sum=sum+a[j]-a[i];
            }
            i++;
        }
        printf("%d\n",sum);
    }
    delete a;
    return 0;
}

這道題目出現超時問題,可能陣列很大或者演算法不夠好,兩個for迴圈時間複雜度較高O(n^2),雖然本地測試的時間限時小於1000ms,但是提交還是超時了,後續需要看看其他大佬怎麼做的……

目前官方提示:最優情況下,所有人必然在由小沃沃出發的在一條射線上(任意兩個人的距離都最小)。我們把 a 排序以後,算距離和就比較簡單了。

測試時間:

 

 

 

 

 

 我的CSDN部落格:https://blog.csdn.net/Charzous/article/details/107581452

 我的部落格園:https://www.cnblogs.com/chenzhenhong/p/13377665.html
————————————————
版權宣告:本文為CSDN博主「Charzous」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/Charzous/article/details/107581452

相關文章