2013暑假集訓B組訓練賽第二場

2021-06-17 15:18:01 字數 2882 閱讀 8843

problem a

codeforces 79a

bus game 

這題先預處理求出三種拿錢方式(0、1、2張100),然後由這三種方式兩兩組合成9種方式;

然後按照優先選擇的規則定義乙個小於號,排一下序就ok了。

之後就是逐一的按照排好的順序取錢。

#include #include using namespace std;  

struct meth

bool operator==(const class meth &ans)const

};

//兩種比較方式

bool cmpc(const struct meth &ans1, const struct meth &ans2)

bool cmph(const struct meth &ans1, const struct meth &ans2)

struct comb

bool operator<(const class comb &ans)const

};

meth mat[3];

comb comb[9];//綜合的使用方式

int cnt, cnthud, cntten;

void prepare()

int main()

} if(cnthud*100+cntten*10>=220 && cntten >= 2)else

} return 0;

}

problem b

codeforces 192a

funky numbers 

水題,先求出所有的10^9以內的k(k+1)/2的數,排序。

然後每個詢問,列舉第乙個k(k+1)/2的數,然後二分查詢是否存在匹配的乙個數,也就是看預處理的陣列裡是否存在n-(k+(k+1)/2)這個數。

#include #include #include using namespace std;  

typedef long long ll;

int cnt, n;

ll num[45000];

ll up = 1000000000;

void prepare()

} int main()

} printf("%s\n", flag ? "yes" : "no");

} return 0;

}

problem c

codeforces 329a

purification 

首先檢查是否可行,不可行的條件就是同時有一整行都不能放並且有一整列不能放。(十字架的形狀)

若可行,肯定是是下面兩種情況:

1.每一行都有一列可以放,放在每一行的這個列

2.每一列都有一行可以放,放在每一列的這個行

#include #include const int maxn = 100+10;

char str[maxn];

int row[maxn], col[maxn], n, m;

int main()

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

int failr = -1, failc = -1;

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

if(failr!=-1&&failc!=-1)

if(failr==-1)else

}return 0;

}

problem d

codeforces 216b

forming teams 

由於每個人最多只有兩個矛盾的人,所有這些人的仇恨關係不是一條鏈就是乙個環(這些鏈和環不會和其他的鏈或環有關)

於是如果我們把有矛盾的人都歸為乙個集合,關鍵就成了查詢數量為奇數的環的個數了

利用並查集,只要兩個人有矛盾關係就把他們歸為乙個集合。

當出現乙個矛盾關係,如果這兩個人之前就有矛盾則說明出現了環,判斷若為奇數,肯定有乙個人要坐板凳了。

#include #include using namespace std;

const int maxn = 100+10;

int n, m, ans;

int fa[maxn], num[maxn];//集合的數量

int root(int cur)

int main()

if((n-ans)%2==1)

ans++;

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

}return 0;

}

problem e

codeforces 266b

queue at the school 

這種題就是照著題目做,一步一步來就可以了

#include #include const int maxn = 60;

char str[2][maxn];

bool flag[maxn];

int n, t, now, pre;

int main()

for(int j = 0; j < n; j++)

if(flag[j])

str[now][j]=(str[pre][j]=='g' ? 'b' : 'g');

else

str[now][j]=str[pre][j];

}str[now][n]=0;

printf("%s\n", str[now]);

}return 0;

}

關於第二次訓練賽

第二次訓練賽甚至比第一次還要差,開始做的時候,因為在調並查集的題目,一時忘了比賽開始時間,這又導致了在開始便就輸在了起跑線上,接下來看a,20分鐘後想到了bfs,不過和p商量後,發現他在吳澤軍的書上找到了原題!用優先佇列做的,感覺很好,在理解了之後,此時時間差不多乙個小時了,開始敲,當然不想用書上的...

2017 8 10暑假集訓第十一天(下午訓練賽)

今天開了二分單調佇列 16道一周,較搜尋圖論題量少了 二分也是比較熟悉的一部分,但是單點佇列一點不會 課件也還沒看 上午a了三道,全是二分的,也比較簡單,有以前做過的題 今天下午,訓練賽比較簡單,有不少大佬都ak了!可惜我沒有 卡在了d題上 感覺自己是對的 因為中間有乙個判斷素數,我就用了sort函...

藍橋杯第二次訓練賽題解

題解計算斐波那契數列的值,n最大為45所以不用高精度直接用long long肯定可以存下。題解每一次都面臨要上幾次台階的問題,一共有三種選擇。使用深度優先搜尋來做這道題。每乙個傳遞的引數n是還剩幾個台階,只有最後所有的台階都走完了才能算一種方案。遞迴return的條件是n為0或者是負數的情況。題解每...