照相(fairphoto)
【題目描述】
有n 頭奶牛站在一條數軸上,第 i 頭奶牛的位置是 pi,奶牛不會重疊站在同乙個位置,
第i 頭奶牛的顏色是 ci,其中 ci 要麼是字元『g』要麼是字元『h』。現在農夫 fj 想給一段連續的奶牛照一張相,前提是滿足一下三個條件之一:
1、這連續一段奶牛的顏色全部是『g』。
2、這連續一段奶牛的顏色全部是『h』。3、這連續一段奶牛,顏色是『h』的奶牛數量和顏色是『g』的奶牛數量相等。
fj 要求照出來的相盡可能的寬,不妨設相片中最右邊奶牛位置是 pj, 相片中最左邊奶牛位置是 pi,那麼 fj 要使得 pj-pi 最大。如果**只有一頭奶牛,那麼輸出 0。
【輸入格式】fairphoto.in
第一行,乙個整數 n。1 <= n <= 100000。
接下來有 n 行,每行的格式是: pi、ci。 0 <=pi <=1,000,000,000
【輸出格式】fairphoto.out
乙個整數。【輸入樣例】
6 4 g
10 h
7 g
16 g
1 g
3 h
【輸出樣例】
7 【解題思路】
此題看似簡單,其實卻因為資料量而提高了難度。首先,連續一段奶牛全部是同顏色的這兩類非常容易找,只需要使用最樸素的演算法過一遍就可以了。
但是第三類,也就是兩種顏色出現的數量相同的這一類,如果暴力列舉,必然超時。
所以利用字首和,將h視作1,將g視作-1(反之也可行)。依照這個求出字首和。例如,求出的字首和為1,0,1,0,1,-1,0,1;可以發現第一位和最後一位的字首和是相等的。也就是說,從第二個開始加上去,加到最後乙個,其實相當於沒有改變過,沒有改變過意味著這其中1和-1的數量相等,那麼也就意味著這段符合第三類的標準,只要這樣求出最長的即可。
【解題反思】
【參考程式】
#include
#include
#include
using
namespace
std;
struct data
c[100001];
bool comp(data s,data r)
sort(c+1,c+1+n,comp);//以位置進行排序,方便尋找
d[1]=100000+c[1].b;//為了防止下標出現負數,全部加上十萬
for (int i=2;i<=n;i++) d[i]=d[i-1]+c[i].b;//求出字首和
tmp=1;
len=0;
for (int i=2;i<=n;i++)
}//暴力尋找第一類和第二類中最長的
maxans=max(maxans,len);//最後還需要進行一次比較,因為最長的有可能在最後一段卻沒有比較
for (int i=1;i<=n;i++)
}cout
0;}
集訓Day1 測試 奇怪數
奇怪數 odometer 題目描述 乙個正整數z是奇怪數,當且僅當滿足的條件是 z的所有數字中,只有乙個數字不同於其他數字。例如 33323 110 都是奇怪數,而 9779 5555 都不是奇怪數。給出兩個正整數 x 和 y,滿足 100 x y 10 16,請問區間 x,y 內有多少個奇怪數?輸...
湖南集訓Day1
難度不斷網 斷網 卡特蘭數取模 由於資料範圍小,直接做。考試時斷網。忘記卡特蘭數公式,推錯了只有5分。數學公式要記別每次都現用現搜!include include include using namespace std int f 1007 int n,m,ans intmain 模數較小是乙個坑點...
國慶集訓Day1
題意 有 n 個數 a 1,a 2,a n 有m個數 b 1,b 2,b n 令 a a 1 times a 2 times times a n 令 b b 1 times b 2 times times b n 判斷 a 是否是 b 的倍數 輸入 n,m 輸出 yes no 做法 就是個一簡單的質...