牛客编程巅峰赛S2赛季第8场AC代码
牛客编程巅峰赛S2赛季第8场AC代码
初级场A
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回将这个数n拆成两个自然数之和一共有多少种拆法(符合规则)。 * @param n int整型 代表题意中的n * @return int整型 */ int solve(int n) { // write code here return (n-1)/2; } };
初级场B / 高级场A
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回总体积为V若干物品的最大总重量,如果g存在选择若干物品总体积为V的情况,返回-1 * @param v int整型vector * @param g int整型vector * @param V int整型 * @return int整型 */ int ans,n,vv; vector<int> V,G; void dfs(int now,int v,int g){ if (now==n){ if (v==vv&&g>ans) ans=g; return; } dfs(now+1,v,g); if (v+V[now]<=vv) dfs(now+1,v+V[now],g+G[now]); } int Maximumweight(vector<int>& v, vector<int>& g, int _vv) { // write code here ans=-1; vv=_vv; n=v.size(); for(int i=0;i<n;++i){ V.push_back(v[i]); G.push_back(g[i]); } dfs(0,0,0); return ans; } };初级场C / 高级场B
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 给定一个字符串s,返回具有相同前缀后缀的子串的第二大长度,反之,返回-1即可。 * @param s string字符串 代表题意中的字符串s * @return int整型 */ int f[1100000]; int solve(string s) { // write code here int j=0; int n=s.length(); f[1]=0; int ans=0; for(int i=2;i<=n;++i){ while (j&&s[i-1]!=s[j]) j=f[j]; if (s[i-1]==s[j]) ++j; f[i]=j; //if (f[i]>ans) ans=f[i]; } ans=f[n]; if (ans==0) ans=-1; return ans; } };高级场C
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param n int整型 有n个城市 * @param m int整型 有m条路径 * @param s int整型 起始城市坐标 * @param t int整型 终点城市坐标 * @param edge int整型vector<vector<>> 边的格式如下:[[u1,v1,a1,b1],[u2,v2,a2,b2],...] * @return int整型 */ const int p=1000000007; long double f[510],fac[1110]; long long g[510],C[1110][1110]; void relax(int u,int v,int a,int b){ if (f[u]+fac[a]-fac[b]-fac[a-b]<f[v]){ f[v]=f[u]+fac[a]-fac[b]-fac[a-b]; g[v]=g[u]*C[a][b]%p; } } int minDist(int n, int m, int s, int t, vector<vector<int> >& edge) { // write code here for(int i=1;i<=1000;++i) fac[i]=fac[i-1]+log(i); C[0][0]=1;//!!!!!!!!!!!! for(int i=1;i<=1000;++i){ C[i][0]=1; for(int j=1;j<=i;++j){ C[i][j]=C[i-1][j]+C[i-1][j-1]; if (C[i][j]>=p) C[i][j]-=p; } } for(int i=1;i<=n;++i) f[i]=1e50; f[s]=0; g[s]=1; for(int i=1;i<=n;++i){ for(int j=0;j<edge.size();++j){ relax(edge[j][0],edge[j][1],edge[j][2],edge[j][3]); relax(edge[j][1],edge[j][0],edge[j][2],edge[j][3]); } } return g[t]; } };