2017.9.2 校内模拟赛
?
?中規中矩的一套題。
然而辣雞的我日常跪
卡SPFA是要哪樣啊。。。再也不寫SPFA了?
??
?
?
100 + 0 + 70 = 170
?
?
“與”
(and.pas/.c/.cpp)
時間限制:1s;空間限制64MB
題目描述:
給你一個長度為n的序列A,請你求出一對Ai,Aj(1<=i<j<=n)使Ai“與”Aj最大。
Ps:“與”表示位運算and,在c++中表示為&。
輸入描述:
第一行為n。接下來n行,一行一個數字表示Ai。
輸出描述:
輸出最大的Ai“與”Aj的結果。
樣例輸入:
3
8
10
2
樣例輸出:
8
樣例解釋:
8 and 10 = 8
8 and 2 = 0
10 and 2 = 2
數據范圍:
20%的數據保證n<=5000
100%的數據保證 n<=3*10^5,0<=Ai<=10^9
?
亂寫了一下,莫名其妙就過了。。。
對所有數二進制拆分,然后排個序
枚舉二進制位
從大的開始找,若找到一組大的并且相等的數,就更新答案
每找完一位就丟掉一位
?
#include <cstdio> #include <iostream> #include <bitset> #include <algorithm>const int BUF = 12312323; char Buf[BUF], *buf = Buf;inline void read (int &now) {for (now = 0; !isdigit (*buf); ++ buf);for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf); }#define Max 300002 #define _L 31struct Bit { int a; bool c[_L]; }; inline bool Comp (Bit A, Bit B) { return A.a > B.a; } Bit key[Max]; int max (int a, int b) { return a > b ? a : b; }int Main () {freopen ("and.in", "r", stdin);freopen ("and.out", "w", stdout);fread (buf, 1, BUF, stdin);int N, x; read (N); register int i, j, k;for (i = 1; i <= N; ++ i){read (x), j = 31; key[i].a = x;for (; x; x >>= 1) key[i].c[-- j] = x % 2; }std :: sort (key + 1, key + 1 + N, Comp);long long Answer = 0;if (key[1].a == key[2].a) return printf ("%d", key[1].a), 0;int pos; static int mi[10]; mi[1] = 2;for (i = 2; i <= 31; ++ i)mi[i] = mi[i - 1] * 2;Answer = key[1].a & key[2].a;for (j = 0; j < _L; ++ j){pos = 0;for (i = 1; i <= N; ++ i){if (key[i].c[j] == 0 && i > pos) { pos = i; break; }if (key[i].a == key[i - 1].a)Answer = max (Answer, key[i].a);}for (i = 1; i < pos; i ++)key[i].a -= mi[_L - j]; }printf ("%d", Answer);return 0; }int ZlycerQan = Main (); int main (int argc, char *argv[]) {;}?
?
?
小象涂色
(elephant.pas/.c/.cpp)
時間限制:1s,空間限制128MB
題目描述:
小象喜歡為箱子涂色。小象現在有c種顏色,編號為0~c-1;還有n個箱子,編號為1~n,最開始每個箱子的顏色為1。小象涂色時喜歡遵循靈感:它將箱子按編號排成一排,每次涂色時,它隨機選擇[L,R]這個區間里的一些箱子(不選看做選0個),為之涂上隨機一種顏色。若一個顏色為a的箱子被涂上b色,那么這個箱子的顏色會變成(a*b)mod c。請問在k次涂色后,所有箱子顏色的編號和期望為多少?
輸入描述:
第一行為T,表示有T組測試數據。
對于每組數據,第一行為三個整數n,c,k。
接下來k行,每行兩個整數Li,Ri,表示第i個操作的L和R。
輸出描述:
對于每組測試數據,輸出所有箱子顏色編號和的期望值,結果保留9位小數。
樣例輸入:
3
3 2 2
2 2
1 3
1 3 1
1 1
5 2 2
3 4
2 4
樣例輸出:
2.062500000
1.000000000
3.875000000
數據范圍:
40%的數據1 <= T <= 5,1 <= n, k <= 15,2 <= c <= 20
100%的數據滿足1 <= T <= 10,1 <= n, k <= 50,2 <= c <= 100,1 <= Li <= Ri <= n
.
數學期望。。??吹骄吞摗!!!?/p>
暴力做法:dp是f[i][j][k]表示第i個箱子第j次染色,染為k顏色的概率
后發現對于每個箱子,它們的本質是相同的,也就是第幾個箱子這一維狀態是不需要存在的。所以dp狀態可簡化為f[i][j],表示操作i次,顏色變為j的概率。
讀入時統計每個箱子操作的次數c[i],初始化f[0][1]=1;
F[i+1][j]+=f[i][j] * 0.5;
F[i+1][(j+k)%c]+=f[i][j] * 0.5 / c;
s[i]統計染色i次的顏色和期望值
然后加起來就好
#include <cstdio> #include <iostream> #include <cstring>const int BUF = 12312312; char Buf[BUF], *buf = Buf; #define Max 55 inline void read (int &now) {for (now = 0; !isdigit (*buf); ++ buf);for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf); } typedef double flo; int c[Max]; flo f[Max][Max << 1], s[Max], Answer;int Main () {freopen ("elephant.in", "r", stdin);freopen ("elephant.out", "w", stdout);fread (buf, 1, BUF, stdin);int T; read (T); int N, C, K, x, y;for (register int i, j, k; T; -- T){read (N), read (C), read (K);memset (f, 0, sizeof f); memset (s, 0, sizeof s);memset (c, 0, sizeof c); Answer = 0; f[0][1] = 1;for (i = 1; i <= K; ++ i){read (x), read (y);for (j = x; j <= y; ++ j) ++ c[j];}for (i = 0; i <= K; ++ i)for (j = 0; j < C; ++ j){f[i + 1][j] += f[i][j] * 0.5;for (k = 0; k < C; ++ k)f[i + 1][j * k % C] += f[i][j] * 0.5 / C;}for (i = 0; i <= K; ++ i)for (j = 0; j < C; ++ j)s[i] += f[i][j] * j;for (i = 1; i <= N; ++ i) Answer += s[c[i]];printf ("%.9lf\n", Answer);} return 0; } int ZlycerQan = Main (); int main (int argc, char *argv[]) {;}?
?
?
?
?
行動!行動!
(move.pas/.c/.cpp)
時間限制:1s;空間限制:128MB
題目描述:
大CX國的大兵Jack接到一項任務:敵方占領了n座城市(編號0~n-1),有些城市之間有雙向道路相連。Jack需要空降在一個城市S,并徒步沿那些道路移動到T城市。雖然Jack每從一個城市到另一個城市都會受傷流血,但大CX國畢竟有著“過硬”的軍事實力,它不僅已經算出Jack在每條道路上會損失的血量,還給Jack提供了k個“簡易急救包”,一個包可以讓Jack在一條路上的流血量為0。Jack想知道自己最少會流多少血,不過他畢竟是無腦的大兵,需要你的幫助。
輸入描述:
第一行有三個整數n,m,k,分別表示城市數,道路數和急救包個數。
第二行有兩個整數,S,T。分別表示Jack空降到的城市編號和最終要到的城市。
接下來有m行,每行三個整數a,b,c,表示城市a與城市b之間有一條雙向道路。
輸出描述:
Jack最少要流的血量。
樣例輸入:
5 6 1
0 3
3 4 5
0 1 5
0 2 100
1 2 5
2 4?5
2 4?3
樣例輸出:
8
數據范圍:
對于30%的數據,2<=n<=50,1<=m<=300,k=0;
對于50%的數據,2<=n<=600,1<=m<=6000,0<=k<=1;
對于100%的數據,2<=n<=10000,1<=m<=50000,0<=k<=10.
?
?
?
堆優化的Dijkstra,用Spfa會被卡
?
F[i][j] 表示第i個點用了j個包的血量
?
轉移時分用和不用兩種情況討論即可
?
?
?
?
#include <cstdio> #include <iostream> #include <queue> #include <cstring>const int BUF = 12312313; char Buf[BUF], *buf = Buf; #define INF (1 << 30) inline void read (int &now) {for (now = 0; !isdigit (*buf); ++ buf);for (; isdigit (*buf); now = now * 10 + *buf - '0', ++ buf); }#define P_Q std :: priority_queue <D> inline int min (int a, int b) { return a < b ? a : b; }struct D {int id, c, d; D () {}D (int _x, int _y, int _z) : id (_x), c (_y), d (_z) {}bool operator < (const D now) const{return this->d > now.d;} };#define Max 10009 struct E { int v, d; E *n; }; E poor[Max * 50], *list[Max], *Ta = poor; P_Q Heap; bool visit[Max][12]; int f[Max][12];int Main () {freopen ("move.in", "r", stdin);freopen ("move.out", "w", stdout);fread (buf, 1, BUF, stdin);int N, M, K, S, T; read (N), read (M), read (K);register int i, j; int x, y, z; read (S), read (T);for (i = 1; i <= M; ++ i){read (x), read (y), read (z);++ Ta, Ta->v = y, Ta->d = z, Ta->n = list[x], list[x] = Ta;++ Ta, Ta->v = x, Ta->d = z, Ta->n = list[y], list[y] = Ta;}Heap.push (D (S, 0, 0)); D res; int V, C, now;memset (f, 0x3f, sizeof f); E *e; int Answer = INF;for (f[S][0] = 0; !Heap.empty (); Heap.pop ()){res = Heap.top (); now = res.id, C = res.c;if (visit[now][C]) continue;visit[now][C] = true;for (e = list[now]; e; e = e->n){V = e->v;if (f[V][C] > f[now][C] + e->d){f[V][C] = f[now][C] + e->d;Heap.push (D (V, C, f[V][C])); }if (C < K && f[V][C + 1] > f[now][C]){f[V][C + 1] = f[now][C];Heap.push (D (V, C + 1, f[V][C + 1]));}}}for (i = 0; i <= K; ++ i) Answer = min (Answer, f[T][i]);printf ("%d", Answer); return 0; } int ZlycerQan = Main (); int main (int argc, char *argv[]) { ; }?
轉載于:https://www.cnblogs.com/ZlycerQan/p/7466899.html
總結
以上是生活随笔為你收集整理的2017.9.2 校内模拟赛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hosts 持续更新 - laod
- 下一篇: 搭建 LAMP 环境