集訓Day1 測試 USACO 照相

2021-08-06 04:27:07 字數 1496 閱讀 9289

照相(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 做法 就是個一簡單的質...