牛客IOI周賽20 普及組(題解)

2021-10-12 10:29:18 字數 3631 閱讀 4929

b 移動撤銷

c 石頭剪刀布

d 夾縫中求和

題目分析:首先,完全數是可以打表的,完全數就是那麼幾個直接打表判斷,剩下的就是過剩數和不足數,那麼有乙個定理那就是奇數是不足數,偶數是過剩數,但是有乙個特例,那就是2835,他雖然是乙個奇數但是卻是過剩數,特殊判斷一下就行

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef

long

long ll;

using

namespace std;

#define pi acos(-1.0)

const

int maxn =

1e5+10;

const

int inf =

0x3f3f3f3f

;const

int mod =

1e9+7;

intmain()

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef

long

long ll;

using

namespace std;

#define pi acos(-1.0)

const

int maxn =

1e5+10;

const

int inf =

0x3f3f3f3f

;const

int mod =

1e9+7;

intmain()

題目分析:棧的思想

如果當前符號不是z的話那我們把它的下標放到動態陣列裡面,如果當前遇到了字元是z,並且當前佇列如果存在即佇列裡有數,那麼就撤銷最近一次的操作就行

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef

long

long ll;

using

namespace std;

#define pi acos(-1.0)

const

int maxn =

1e5+10;

const

int inf =

0x3f3f3f3f

;const

int mod =

1e9+7;

vector<

int> v;

char c[maxn]

;int

main()

for(

int i =

0; i < v.

size()

;++i)

printf

("%d %d\n"

, x, y)

;}

題目分析:貪心思想

為了能得到盡可能多的分,那麼牛牛就不可能輸,最差的也是平手,所以我們要讓牛牛能多贏一次就多贏一次,那麼就用到了貪心的思想,我們每次都找能讓牛牛贏的局,因為每一次都能得到兩分,然後在剩餘的情況裡,讓他們匹配平手的情況,每一種情況加一分,這樣牛牛就得到最高的分了

#include

using

namespace std;

intmain()

題目分析:題目要我們求一共有多少對數字,滿足大於x小於y,那麼我們首先讓陣列從小到大排列,我們可以用乙個陣列去記錄一下滿足題目要求的數,如果當前陣列的數大於y那麼他將永遠不能構成滿足條件的數,我們把小於y的數用另乙個陣列去儲存,然後對它進行從小到大排序,我們利用區間的方法去求解這道題,就一直遍歷下去,求解左端點和右端點,左端點:如果當前兩個數相加小於x那麼左區間往右移動,類似的,右區間也是同樣的求法,最後只需要把區間想減就是我們想要得到的答案,把左右滿足的區間相加就是這個題目的答案

#include

#include

#include

#include

#include

#include

#include

#include

#include

typedef

long

long ll;

using

namespace std;

#define pi acos(-1.0)

const

int maxn =

2e6+10;

const

int inf =

0x3f3f3f3f

;const

int mod =

1e9+7;

ll a[maxn]

, num[maxn]

;int

main()

sort

(num +

1, num + cnt +1)

; ll l =

2, r = cnt, ans =0;

for(ll i =

1; i <= cnt;

++i)

printf

("%lld\n"

, ans)

;}

從方法一中可以看到,我們是去找左端點和右端點,然後求區間長度,那麼我們可以想到,找乙個數最快的方法就是二分查詢

stl 自帶的二分函式—— upper_bound和lower_bound

這兩個函式的作用是二分查詢乙個數在陣列**現的位置。區別是upper返回第乙個大於搜尋數的位置,而lower是第乙個大於等於的數的位置。

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

1e6+10;

ll a[maxn]

;int

main()

printf

("%lld\n"

, ans)

;}

微博上看過這麼一段話「最慘的,並不是莫名其妙的被人給領上了一條迷路,而是當你背上孤獨拿上劍,決定要馬不停蹄,一意孤行的時候,突然冒出乙個人,把你抱緊,說,少年,我想和你分享這漫長的一生,你一激動,把劍扔了,把馬烤了,一回頭,人沒了。」

牛客IOI周賽20 普及組

牛客的簽到題,最暴力的做法就是把數每個因子羅列出來,但是這樣只有60的暴力分,我們從題目的資料可以看到 資料範圍是1e7的,在學習素數的時候我們知道乙個因子就能推出另乙個因子,所以我們沒必要從1判斷到n 1 直接i i n就能找到所有的因子,但是注意像16這樣的數,當我們的i為4的時候,這個4的因子...

牛客IOI周賽23 普及組全題解

鏈結水題不多說 統計字元就完了 int main cout 鏈結 硬模擬兩層for,記得取模 ll a maxn ll x maxn int n,m ll ans maxn int main for int i 1 i m i return0 鏈結 注意,直接使用string可能會t 不是可能,是必...

牛客IOI周賽22 普及組

1.戰爭尾聲 題目鏈結 題解 因為資料量非常小,直接遍歷每乙個點即可 include include include using namespace std typedef pair int,int pii double getlength double x,double y,pii v intma...