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%。。。
查看22道真题和解析