【題目描述】
【輸入描述】
第一行輸入乙個,表示卡牌數量。
第二行輸入乙個由』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的那一張
然後。。。做完了
下面貼上**
#includeusingnamespace
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 優化 發現列舉大小的桶有很多是空的,實際上,可以證...