第一题 忘记怎么在最前面插入了...所以就直接reverse了(反正不会TLE 100%
#include<bits/stdc++.h> using namespace std; int n,m,k,ans = -1; string s,ss = ""; bool f(string s) { int l = 0, r = s.size()-1; while (l <= r) { if (s[l] != s[r]) return false; l ++, r --; } return true; } int main() { cin >> s; n = s.size(); while (f(s+ss) == false) { reverse(ss.begin(), ss.end()); ss.push_back(s[m]); reverse(ss.begin(), ss.end()); m ++; if (m >= n) break; } cout << s+ss; }
#include<bits/stdc++.h> using namespace std; int T,N,DROP; int a[16]; void dfs(int mul, int index, int drop) // mul = VALUEA - VALUEB { if (mul == 0 && index == N+1) DROP = min(DROP, drop); if (index > N) return; // cout << mul << " " << index << " " << drop << "\n"; dfs(mul+a[index], index+1, drop); dfs(mul-a[index], index+1, drop); dfs(mul, index+1, drop+a[index]); } int main() { cin >> T; while (T --) { cin >> N; DROP = 0; for (int i = 1 ; i <= N ; i ++) { cin >> a[i]; DROP += a[i]; }; dfs(0, 1, 0); cout << DROP << "\n"; } }
第三题 DP 100%
#include<bits/stdc++.h> using namespace std; int T,N,M; int a[2005], b[2005]; int dp[2005]; void print(int k) { k %= (60*60*24); int h = 8+k/3600; int m = (k/60)%60; int s = k%60; int am = 0; if (h>=24) am = 1; else if (h > 12) am = 0; else am = 1; if (h<10) printf("0%d:",h); else printf("%d:",h); if (m<10) printf("0%d:",m); else printf("%d:",m); if (s<10) printf("0%d ",s); else printf("%d ",s); if (am) printf("am\n"); else printf("pm\n"); } int main() { scanf("%d",&T); while (T --) { scanf("%d",&N); dp[0] = INT_MAX; for (int i = 1 ; i <= N ; i ++) { scanf("%d",&a[i]); dp[i] = INT_MAX; } for (int i = 2 ; i <= N ; i ++) scanf("%d",&b[i]); dp[N] = 0; for (int i = N ; i > 0 ; i --) { if (i == 1) dp[i-1] = min(dp[i-1], dp[i]+a[i]); else { dp[i-1] = min(dp[i-1], dp[i]+a[i]); dp[i-2] = min(dp[i-2], dp[i]+b[i]); } } // printf("%d\n",dp[0]); print(dp[0]); } }
第四题 强连通分量 10%
Tarjin模板提
可惜笔试不能看板子,手撸不会...
暴力应该能骗点分
全部评论
(4) 回帖