4.9美团笔试cpp,227%,欢迎大佬拍砖
大家一起讨论,求大佬拍砖
第一题日期操作,感觉自己写的没问题,只AC了72%,很奇怪
#include<bits/stdc++.h> using namespace std; /* 3 02:10 200 输出: 周几 时间 */ int main() { int now_day; string time; int interval; string tmp_hour; string tmp_minute; int comma; cin >> now_day >> time >> interval; tmp_hour = time.substr(0, 2); tmp_minute = time.substr(3); int hour = stoi(tmp_hour); int minute = stoi(tmp_minute); int cur_time = hour * 60 + minute; interval = interval % 10080; int i = interval / 1440; i = i % 7; interval = interval % 1440; //不处理天数 int pre_time = cur_time - interval; int pre_day = now_day; if (pre_time < 0) { pre_day--; pre_time = 1440 - abs(pre_time); } pre_day -= i; if (pre_day < 0) pre_day += 8; int pre_hour = pre_time / 60; int pre_minute = pre_time % 60; cout << pre_day << endl; if (pre_hour < 10) cout << "0"; cout << pre_hour << ":"; if (pre_minute < 10) cout << "0"; cout<< pre_minute << endl; return 0; }第二题找逆序对,开始用的错误算法,后来用dp,一次过;
#include<bits/stdc++.h> using namespace std; /* 5 5 3 1 4 2 2 4 5 1 3 3 */ int main() { int n; cin >> n; int cnt = 0; vector<int> vec1(n); vector<int> vec2(n); vector<int> dp(n); //dp表示,之后的所有人里最早出发的 map<int, int> mp; for (int i = 0; i < n; i++) { cin >> vec1[i]; mp[vec1[i]] = i; } for (int i = 0; i < n; i++) cin >> vec2[i]; //for (int i = 0; i < n; i++) { // int tmp = vec2[i]; // if (i > mp[tmp]) cnt++; // } dp[n - 1] = mp[vec2[n-1]]; for (int i = n - 2; i >= 0; i--) { int tmp = vec2[i+1]; dp[i] = min(dp[i + 1], mp[tmp]); } for (int i = n-1; i >=0; i--) { int tmp = vec2[i];//如果该人晚于后面任意一个人(最早出发)出发,那么算一次超越 if (mp[tmp] > dp[i]) cnt++; } cout << cnt; return 0; }第三题,开始用暴力方法做超时,后来改等比数列求和,还是超时。。。27%
#include<bits/stdc++.h> using namespace std; /* 10 3 8 */ int main() { int n, k; cin >> n >> k; /* for (int i = k; i < n; i++) { //i是第一天修的bug, 第二天 i/ k int remain = n; int tmp_i = i; while (tmp_i) { remain -= tmp_i; tmp_i /= k; } if (remain == 0) { cout << i; return 0; } } */ for (int i = k; i < n; i++) { //i是第一天修的bug, 第二天 i/ k int remain = n; int tmp_i = i; int exp = 0; int tmp_n = n; while (tmp_n > 0) { tmp_n /= k; exp++; }; int exp_ = log(tmp_n); int sum = i * (1 - pow((1 / double(k)), exp)) / (1 - 1/double(k)); if(sum >= n) { cout << i+1; return 0; } } return 0; }第四题,自己走错方向了,没做出来,直接输出的样例,9%,这份代码是交卷后写的,不知道能不能AC
#include<bits/stdc++.h> using namespace std; /* 3 6 */ int ans = 0; vector<int> path; int vis[4] = { 0 }; void dfs(int i, int depth, int& step) { if (i < 0 || i > 3 || vis[i] == 1) return; if (depth == step) { if (i == 0) ans++; return; } for (int k = 0; k < 4; k++) { path.push_back(i); if (k != i) dfs(k, depth + 1, step); path.pop_back(); } } int main() { int step; cin >> step; dfs(0, 0, step); cout << ans; return 0; }第五题,没来得及思考,直接输出样例,16%。。。