20171009模擬賽總結

2021-08-09 03:47:17 字數 3825 閱讀 9856

給定乙個長度為n的序列,然後現在要在中間取出乙個區間,求最大值^次大值的最大值

n<=2*10^6

一開始完全在分析異或有什麼特點可以用在最大值次大值上的…一開始的想法是trie樹不過越往下想覺得第一題怎麼可能那麼麻煩。

然後就來看區間內最大值和次大值有什麼特點了。

其實關於這類問題做得應該不算少了。大概有兩種方法。

分治solve(l,r)表示解決區間[l,r]內最大值最小值的問題。

首先掃一遍找到最大值,假設位置位於m,值為mx。

那麼向左向右各掃一遍,求出mx為最大值的時候的次大值然後順便更新一下答案。

然後solve(l,m-1); solve(m+1,r);

struct aaa

mx1=a[mid+1]; res=max(res,mx^mx1);

for (i=mid+1; i<=r; i++)if (a[i]>mx1)

}void sol()

}pianfen;

單調棧

字面意思直接把每一對最大值和次大值整出來就好了

int main()

top=0;

for (i=n; i>=1; i--)

printf("%d",res);

return

0;}

沒有想到單調棧其實是很可惜的,因為寫分治的時候就覺得萬一出資料卡一卡就會被打回o(n^2)了然後整場比賽都挺擔心第一題。

好在沒有特地出資料卡。

用乙個n位數來表示乙個原子,每一位的數字大小∈[0,n],可以擁有前導0但是不能全是0。

現在乙個長度為n的數,裂變後第一位表示這個數有幾個1,第二位表示有幾個2,依次。

例如:1104

裂變後就變成2001 (2個1,0個2,0個3,1個4)

有t組資料。對於每一組資料

讀入乙個n位數,求有多少個n位數可以裂變成它。

n<=9;t=100。

p50首先是暴力。比如對於now(乙個n位數)來說。

cnt[i]表示第i位的數字是多大。

能變成他的必然滿足有cnt[i]個i。然後就變成求乙個排列。

寫的是bfs表示方案,dfs求排列。

//dfs

void dfs(string s,int last,int

sum)return;}

int i;

if (last>sum)

for (i=1; i<=len; i++)if (cnt[i])

}//bfs

void bfs()

}

p100

可以把所有數分成兩類。

第一類是sum[cnt[i]]>n的,就當它為b類數,這類數字不能由其他的裂變而來。res=1

第二類是sum[cnt[i]]<=n的,就當它為a類數。res=所有可以一步變成它的res之和。

可以發現乙個數的裂變過程中是不會產生環的。

除了1後面跟(n-1)個0的情況下會有乙個自環,判掉就好了。

對於乙個a類數,如果有乙個b類數能轉化成它,那麼能轉化成它的就全都是b類數。這裡求個排列數就好了。

如果不是,那就強行求排列再往下遞迴就好了。

來自某同學的友情提供:即使是n=9的情況下,a類數的個數大約在40000左右。

#include

using

namespace

std;

int n;

int jiecheng[10];

int solve(int x)

if (k>n)return

1; if (l>n)

int id=n-k;

for (i=1; i<=n; i++)

int s;s=0;

for (i=0; i10+a[i];

if (s!=x)res+=solve(s);

for (; next_permutation(a,a+n);)

return res+1;

}char s[15];

int main()

return

0;

}

其實這道題還是挺滿意的?水到了意料之外的75,一開始還以為只有50的,看來資料沒有出長度全是最大值還都是100…0的情況。

有n個旅遊團。每個團都有a[i]個人。巧克力一盒有p塊。吃完前不能開新的一盒。如果乙個團內所有的人吃的都是新開的巧克力的話,那他們就會很開心。

求怎麼分配能使開心的旅遊團數量最多。

p<=4,n<=10000,a[i]<=1e9

p好小σ

p==2 所有偶數的先吃

然後奇數一人乙個

p==3

所有三的倍數先吃

然後偶數乙個奇數乙個

最後奇數乙個乙個乙個

cnt3+min(cnt1,cnt2)+(max(cnt1,cnt2)-min(cnt1,cnt2)+2)/3;

p==4

怎麼覺得這題不算很難…?是我想錯了莫?

總之4倍數的先吃。

好 吃完了。

然後剩下餘數為1,2,3的

盡可能多把它們組成4的倍數。

首先22內銷,然後13搞。

搞完再1111,3333,1133,1333,1113(就是1,3混起來4個)

然後最後112,332(兩個1或3,加上乙個2)

如果還有剩餘就再res++

#include

#include

#define m 10005

using namespace std;

void read(int &x)

int n,a[m];

struct aaa

}pianfen;

struct ccc

printf("%d\n",res+(cnt+1)/2);

}

}p30;

struct acc

printf("%d\n",res+min(cnt1,cnt2)+(max(cnt1,cnt2)-min(cnt1,cnt2)+2)/3);

}}p60;

struct aac

int num=min(cnt1,cnt3);

res+=num; cnt1-=num; cnt3-=num;

res+=cnt2/2; cnt2=cnt2&1;

ints=(cnt1+cnt3);

num=s/4;

res+=num; s&=3;

if (s>=2&&cnt2) res++,s-=2,cnt2--;

if (s||cnt2) res++;

printf("%d\n",res);

}

}p100;

int main()

return

0;}

比賽的時候只敲到60,因為p==4的情況似乎弄錯了一點結果一分都沒有。

有點可惜不過還算很滿意了。(因為題目好像不是很難)

其實。很滿意啦——沒了。

非要說的話這幾天也在寫深搜,像第二題這種把狀態分類來求的做法,還是挺有用的。能有效的減掉一層枝。

然後第三題的話沒水到所有分有點可惜不過也在意料之內。

20151006模擬賽總結

今天上午去一中,又考了個模擬賽。這次的題有點考思維。我感覺這個第一題難度稍微大了點。一般noip第一題要麼是簡單的模擬,要麼是裸的簡單演算法,這次的第一題要自己構造演算法,並且還是列舉和貪心套在一起。我開始想的是列舉 揹包,複雜度為n 3,但是資料範圍沒給出三次方的分。於是我就覺得不靠譜。然後發現列...

20151031模擬賽總結

今天去一中,考了個模擬賽,真是坑。本來在八中食堂愉快的享受我的早飯 週末早上的番茄雞蛋燙飯 韭菜肉餅簡直爽!然後geng4512就跑過來說要去一中考試,然後兩口喝完燙飯就和他一起狂跑過去了。這次第一題組合數取模,模的不是質數。想了好大半天,沒什麼想法,然後看了下後面的題,又回來做這道題,想起了階乘分...

20160521模擬賽總結

20160521模擬賽是程式設計實習課程安排的第一次模擬賽 比賽鏈結 備註 這個系列模擬賽屬於程式設計實習練習賽,題目有很大一部分事先練習過,做這些題目為了練習碼 熟練度,也為了進行模擬考試練習的機會,所以這個系列模擬賽我每一次都參加,作為練習 題目清單見下 已解決 01 浮點數求高精度冪 已解決 ...