時間限制:c/c++ 1秒,其他語言2秒
空間限制:c/c++ 32768k,其他語言65536k
64bit io format: %lld
題目描述
給出共享長方體乙個頂點的三個面的面積,求它十二條邊的邊長和。
輸入描述:
一行三個整數a, b, c表示面積(1 <= a, b, c <= 10000)。
輸出描述:
一行乙個整數表示邊長和。
示例1
輸入 1 1 1
輸出 12
示例2
輸入 4 6 6
輸出 28
**
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
int n = (int) 10000 + 11;
const
int m = (int) 1e6 + 11;
const
int mod = (int) 1e9 + 7;
const
int inf = 0x3f3f3f3f;
int main()}}
}return
0;}
時間限制:c/c++ 3秒,其他語言6秒
空間限制:c/c++ 262144k,其他語言524288k
64bit io format: %lld
題目描述
給定一幅n個點m條邊的圖和s個一定要經過的點,問從0號點出發,經過這s個點再回到0號點的最短路徑長度是多少。
輸入描述:
第一行乙個整數t(t <= 2)表示資料組數。
對於每組資料,第一行兩個整數n,m表示點數和邊數(1 <= n, m <= 100,000)。
接下來m行,每行三個整數x, y, z(0 < x, y < n, 0 <= z <= 1000)表示xy之間有一條長度為c的雙向邊;
接下來乙個整數s。(s<=10)
接下來s行每行乙個整數表示一定要經過的點。
資料保證有解。
輸出描述:
t行,每行乙個整數表示答案。
示例1
輸入 1
4 6
0 1 1
1 2 1
2 3 1
3 0 1
0 2 5
1 3 5
3 1
2 3
輸出 4
分析: 一開始看 感覺很像 優先佇列的bfs + 狀態壓縮 (感覺和之前做的很像),但是卻無限wa, 好吧, 通過這次,我明白了, 狀態壓縮 不能夠加 優先佇列的bfs,如果每次移動都是相同距離,那麼就可以用了。
就比如下面這個資料 就過不了。
1 4 6
0 1 1
1 2 1
2 3 1
3 0 1
0 2 5
1 3 5
2 2
3 出問題的點: 到達 2這個點的時候,一定是最短的,而且狀態正好是滿的(走完了所有關鍵點),但是它卻有一條邊直接走向了0,但是最短的路徑卻不是這個。
狀壓 + bfs的錯誤**
#include
using
namespace
std;
const
int n = (int) 1e5 + 11;
const
int m = (int) 1e6 + 11;
struct node
node(int _id, int _step, int _state)
friend
bool
operator
< (node a, node b)
};struct edge
edge (int _from, int _to, int _val, int _next)
}edge[n * 2 + 1];
int head[n + 1], top; int n, m, ss;
void init()
void addedge(int a, int b, int c)
void getmap()
}bool vis[n + 1][(1
<< 11)];
map id; int full;
int bfs()
for(int i = head[now.id]; i != -1; i = edge[i].next)
}return -1;
}int main()
// printf("%d \n", full);
printf("%d\n", bfs());
}return
0;}
正解: 思路寫在了**中:
**
#include
using
namespace
std;
const
int n = (int) 1e5 + 11;
const
int m = (int) 1e6 + 11;
struct edge
edge (int _from, int _to, int _val, int _next)
}edge[n * 2 + 1];
int head[n + 1], top; int n, m, ss;
void init()
void addedge(int a, int b, int c)
bool vis[n + 1]; int dis[n + 1];
int spfa(int s,int t)}}
}return dis[t];
}int dis[20][20], p[20];
int solve()
int ss; scanf("%d", &ss);
p[0] = 0;
for(int i = 1; i <= ss; i++ ) scanf("%d", &p[i]);
memset(dis, 0x3f, sizeof(dis));
for(int i = 0; i <= ss; i++)
}dis[0] = 0;
for(int i = 1; i <= ss; i++) dis[i] = i;
int ans = 0x3f3f3f3f;
dowhile(next_permutation(dis + 1, dis + ss + 1)) ;
return ans;
}int main()
return0;}
/*200
4 60 1 1
1 2 1
2 3 1
3 0 1
0 2 5
1 3 511
*/
牛客練習賽24 E 青蛙(最短路)
有乙隻可愛的老青蛙,在路的另一端發現了乙個黑的東西,想過去一 竟。於是便開始踏上了旅途 一直這個小路上有很多的隧道,從隧道的a進入,會從b出來,但是隧道不可以反向走。這只青蛙因為太老了,所以很懶,現在想請你幫幫慢,問他最少需要幾步才可以到達對面。將小徑看作一條數軸,青蛙初始在0上,這只青蛙可以向前跳...
牛客練習賽24 D 插排樹(最短路練習)
插排樹時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 一年一度的山東省oi夏令營又開始了,每到這個季節,山東的oier們都會歡聚這裡,一起學 tu 習 fe 當然,為了能更加愉快地學 tu 習 fe 就少不了要自帶電...
牛客練習賽9
時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 珂朵莉想每天都給威廉送禮物,於是她準備了n個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...