校內集訓(20170903)

2022-05-16 03:36:12 字數 4097 閱讀 2172

【題目描述】

【輸入描述】

第一行輸入乙個,表示卡牌數量。

第二行輸入乙個由』b』,』g』,』r』組成的長度為的字串,分別表示卡牌的顏色為藍色、綠色、紅色中的一種。

【輸出描述】

輸出』b』,』g』,』r』中的若干個字母,按字典序輸出。代表可能的最後一張牌的顏色。

【樣例】

輸入1輸出1rbg

輸入2輸出2

grgbr

輸入3輸出3

bbbb

b【資料範圍】

對於100%的資料,n<=200

——————————————————我是分割線————————————————————

這是一道簡單分析題。(入門難度。。不要吐槽)

很顯然我們發現如果3張牌都超過一張,三種情況都會出現(bgr)

那麼如果有2張牌都超過2張,同上

剩下3種情況:

1,1,0(數字表示牌的數量)那麼答案就是牌數是0的那張

2,1,0(2表示2張以上)那麼答案就是牌數為1和0的兩張

1,0,0(1表示一張以上)那麼答案就是牌數為1的那一張

然後。。。做完了

下面貼上**

#includeusing

namespace

std;

int a[4

],n;

inter,yi,sa;

char

ch;char ans[3]=;

void swap(int &a,int &b)

intmain()

for(int i=1;i<=3;i++)if(a[i]>=2)er++;

for(int i=1;i<=3;i++)if(a[i]>=1)yi++;

if(er>=2||yi==3)puts("

bgr"

);

else

if(er==1&&yi==2

)else

if(yi==2

)else

if(yi==1

) fclose(stdin);

fclose(stdout);

}

————————————————我是分割線——————————————————

【題目描述】

lrb目前有個數字,他想知道這個數中選出若干個數,平均數減中位數的最大值是多少。可以證明,對於乙個遞增數列,如果是平均數減中位數最大時的中位數,表示在兩邊分別取相鄰數字的數量,表示以為中位數,在兩側各取相鄰個數時平均數減中位數的值,那麼為關於的單峰函式。

【輸入描述】

第一行為,為數字個數。

第二行有個數,分別代表個數字。

【輸出描述】

輸出乙個數,為平均數減中位數的最大值,保留兩位小數。

【樣例】

輸入輸出

1 2 3 4

0.33

【資料範圍】

對於60%的資料,n<=21

對於75%的資料,n<=1000

對於100%的資料,n<=10^5,0<=ai<=10^6

——————————————————我是分割線————————————————————

這題首先我們要想到的就是列舉中位數。

那麼假設我們已知某乙個數是中位數,那麼我們怎麼求最優的答案呢?

對於乙個已經排序過的數列,

顯然我們要在這個中位數的左邊和右邊同時取相同數量的數。

對於中位數的左邊,顯然越靠近中位數的數越優,

對於中位數的右邊,越遠離中位數的數越優。

所以對於第i個數作為中位數的情況,我們左邊從第i-1位開始向左取數,右邊從第n位開始向左取數。而取數的個數自然就是三分啦!(三分的過程用字首和o(1)求平均數)

至於為什麼偶數個數的數列不是最優解,這個我留個坑以後來填。

下面貼**(當然我寫了偶數版本)

#include#include

#define mn 100005

using

namespace

std;

inta[mn],n;

long

long

sum[mn];

double ans=-100000000

;int

main()

la=(double)(sum[i-1]-sum[i-1-l]+sum[n]-sum[n-l]+a[i])/(double)(2*l+1

); ra=(double)(sum[i-1]-sum[i-1-r]+sum[n]-sum[n-r]+a[i])/(double)(2*r+1

);

if(ladouble

)a[i]);

else ans=max(ans,la-(double

)a[i]);

}la=ra=(double)(a[1]+a[2])/2.0

;

for(int i=1;i)

la=(double)(sum[i-1]-sum[i-1-l]+sum[n]-sum[n-l]+a[i]+a[i+1])/(double)(2*l+2

); ra=(double)(sum[i-1]-sum[i-1-r]+sum[n]-sum[n-r]+a[i]+a[i+1])/(double)(2*r+2

);

if(ladouble)((double)(a[i]+a[i+1])/(double)2

));

else ans=max(ans,la-(double)((double)(a[i]+a[i+1])/(double)2

)); }

printf(

"%.2lf\n

",ans);

fclose(stdin);

fclose(stdout);

}

————————————————我是分割線————————————————

【題目描述】

lrb去櫃員機取錢,並輸入了他的四位密碼。但是這一切都被乙個黑幫拍攝了下來。幸好,這一次他的銀行卡裡並沒有剩餘任何錢。lrb知道了他的賬戶被異常登入後十分害怕,然後修改了他的密碼。從此以後他為了不被看出密碼,他開始「徐晃」。但這一切還是被拍攝了下來,拍攝多次以後,這個黑幫找到了你,希望你在一秒內幫他算出lrb的可能使用的密碼數量。

【輸入描述】

第一行輸入乙個,為lrb被拍攝的動作次數。

接下來行,每行第乙個數為,表示lrb接下來的手指移動次數,接下來為乙個長度為的數字串,表示lrb手指經過的軌跡。lrb手指經過的位置,可能沒有按,也有可能按了多次。

【輸出描述】

輸出一行,為可能的密碼數量。

【樣例】

輸入輸出

3 123

3 234

解釋lrb可能用的是2222,2223,2233,2333,3333五種密碼

【資料範圍】

設所有軌跡串的總長度為。

對於35%的資料,l<5000

對於100%的資料,1<=n<=1000,1<=t<=10^4,l<=10^6

——————————————————我是分割線——————————————————

這道題有乙個簡單思路(想不到的都是腦子抽了,比如我)

我們只要列舉所有的密碼就好了

然後就是如何在o(n)時間內check乙個密碼

我們只要開乙個陣列記錄從每一位開始,後面的第乙個0-9分別在第幾位,如果都能夠找到,那麼密碼合法。

下面貼**

#include#define mn 1005

#define m 1000005

#define f(x,l,r) for(int x=l;x<=r;x++)

using

namespace

std;

char e[m];int f[m][10

],ans,n,t[mn];

intmain()

f(a,

0,9)

f(b,

0,9)

f(c,

0,9)

f(d,

0,9)

printf(

"%d\n

",ans);

}

五一校內集訓

day1 語言基礎 int unsigned int等等的區別以及原理 以及溢位的情況 時間複雜度的分析很詳細很詳細 p,np,npc,np hard的區別 自己看的時候leng是沒看懂 常用庫函式的介紹 排序 是否基於比較 試用情況 時間複雜度 資料結構是大部頭 vector list queue...

10 3 校內集訓 解題報告

題目背景 於大夫建造了乙個美麗的池塘,用來讓自己愉快的玩耍。這個長方形的池子被分割成了m 行和n 列的正方形格仔。池塘中有些地方是可以跳上的荷葉,有些地方是不能放置荷葉也不能跳上的岩石,其他地方是池水 當然於大夫也是不能游泳的 題目描述 於大夫十分有趣,他在池塘跳躍的方式和象棋中的馬一樣可以向八個方...

CSP校內集訓 打撲克

有 n 堆大小為1的撲克,支援合併兩堆撲克和查詢有多少對撲克堆滿足 size i size j leq c c 不確定 暴力做法 開桶記錄當前存在有多少個大小為 i 的堆,查詢可用樹狀陣列或者雙指標,時間複雜度 o m 2logn 或者 o m 2 優化 發現列舉大小的桶有很多是空的,實際上,可以證...