9.26 360笔试第一题AC代码

排序标准是先排加速度从大到小,如果相等排序时间从大到小。
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool greater_vec(vector<int> a, vector<int> b)
{
	if (a[0] > b[0])
		return true;
	else if (a[0] == b[0])
		return a[1] > b[1];
	else
		return false;
}

int main()
{
	int n;
	cin >> n;
	vector<vector<int>> acc(n, vector<int>(2, 0));
	for (int i = 0; i < n; i++)
		cin >> acc[i][0] >> acc[i][1];
	sort(acc.begin(), acc.end(), greater_vec);
	double v = 0;
	double s = 0;
	for (int i = 0; i < n; i++)
	{
		double a = acc[i][0];
		double t = acc[i][1];
		s += v*t + 0.5*a*t*t;
		v += a*t;
	}

	printf("%.1f", s);
	return 0;
}
第二题73%代码,滑动窗口方式计算区间和,如果滑动窗口右侧的数比当前平均值大,扩展滑动窗口,否则在下一个位置进行滑动窗口操作。
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	int n, m;
	cin >> n >> m;
	vector<int> a(n, 0);
	int tmp = 0;
	double max = 0;
	double cur;
	for (int i = 0; i < n; i++)
		cin >> a[i];

	int i = 0;
	int j = m - 1;

	for (int k = 0; k < m; k++)
		tmp += a[k];

	while (i < n - m && j < n)
	{
		cur = (double)tmp / (j - i + 1);
		if (cur > max)
			max = cur;

		if (j<n-1 && a[j + 1]>cur)
		{
			j++;
			tmp += a[j];
		}
		else
		{
			i++;
			if (i < n - m)
			{
				j = i + m - 1;
				tmp = 0;
				for (int k = i; k <= j; k++)
					tmp += a[k];
			}
		}
	}

	printf("%.3f\n", max);
    return 0;
}



#笔试题目##360公司##题解#
全部评论
我是加速度与时间乘积从大到小排列,18%🤨
点赞
送花
回复
分享
发布于 2019-09-26 21:25
😂只按加速度排序就行了 时间无所谓
点赞
送花
回复
分享
发布于 2019-09-26 21:14
滴滴
校招火热招聘中
官网直投
第二题ac代码呢😭大佬
点赞
送花
回复
分享
发布于 2019-09-26 21:15
ac了百分之百吗?加速度一样的情况下,感觉不需要再排时间从大到小
点赞
送花
回复
分享
发布于 2019-09-26 21:15
我也是加速度从大到小,然后18,找不到原因
点赞
送花
回复
分享
发布于 2019-09-26 21:18
比较任意两个加速块,哪个在前走的距离更远,根据这个比较维护一个最大堆,最大堆的的元素就是加速块。 在计算的时候最终位移的时候,弹出一个加速块,计算唯一,维持经过这个加速块后的速度,并把经过这个加速块的位移加到最终的位移上去。 import java.util.*; public class Main { private static Scanner input; public static void main(String[] args) { input = new Scanner(System.in); int N = input.nextInt(); PriorityQueue<int[]> queue = new PriorityQueue<>(N, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { //o1 在 o2 前  double l1 = 0.5 * o1[0] * o1[1] * o1[1]; double v1 = o1[0] * o1[1]; double l2 = v1 * o2[1] + 0.5 * o2[0] * o2[1] * o2[1]; // o2 在 o1 前 double L1 = 0.5 * o2[0] * o2[1] * o2[1]; double V1 = o2[0] * o2[1]; double L2 = v1 * o1[1] + 0.5 * o1[0] * o1[1] * o1[1]; return (int)(l1 + l2 - L1 - L2);//维护一个最大堆 }} ); int[] cell = null; for(int i = 0; i < N; i++) { cell = new int[2]; cell[0] = input.nextInt(); cell[1] = input.nextInt(); queue.offer(cell); } double distance = 0; double x = 0; double v = 0; while(!queue.isEmpty()) { int[] block = queue.poll(); x = v * block[1] + 0.5 * block[0] * block[1] * block[1];// x = v0 * t + 0.5 * a * t * t v = v + block[0] * block[1]; //v = v + a * t  保持经过一个加速块后的速度 distance += x; } System.out.printf("%.1f", distance); } }
点赞
送花
回复
分享
发布于 2019-09-26 21:31
加速度不会超过1k,直接建一个1k大的数组,加速度为下标,时间累加。最后从后往前遍历只能过80。为什么
点赞
送花
回复
分享
发布于 2019-09-26 21:59
def find(nums, k):     res = sum(nums[0:k])      tmp = res     n = len(nums)     for i in range(k, n):         tmp = tmp - nums[i - k] + nums[i]         res = max(res, tmp)     return res / (k + 0.0) python这么写哪里不对吗?不能a啊
点赞
送花
回复
分享
发布于 2019-09-26 22:00
#第一题代码 bool cmp(pair<int, int> p1, pair<int,int>p2) {     if (p1.first == p2.first)         return p1.second > p2.second;     return p1.first > p2.first; } void test360_1() {     int n{ 0 };     cin >> n;     int a{ 0 }, t{ 0 };      vector<pair<int, int>> VP;     for (int i = 0; i < n; i++)     {         cin >> a >> t;         VP.push_back(make_pair(a, t));     }     sort(VP.begin(), VP.end(), cmp);     for (auto it : VP)         cout << it.first << "\t" << it.second << endl;     float L{ 0.0 };     float v0{ 0.0 };     float temp{ 0.0 };     for (int i = 0; i < n; i++)     {         temp = v0 * VP[i].second + 0.5 * VP[i].first * pow(VP[i].second, 2);         v0 = v0 + VP[i].first * VP[i].second;         L += temp;     }     cout << fixed << setprecision(1);     cout << L << endl; } #第二题代码 void test360_2() {     int n{ 0 }, m{ 0 };     cin >> n >> m;     vector<int> rec;     for (int i = 0; i < n; i++)     {         int temp;         cin >> temp;         rec.push_back(temp);     }     float sum{ 0.0 };     for (int i = 0; i < n - m + 1; i++)     {         float temp{ 0.0 };         for (int j = i; j < i + m; j++)             temp += rec[j];         sum = max(sum, temp);     }     cout << fixed << setprecision(3);     cout << (sum /= m) << endl; } #### 为什么都没有AC呀,好奇怪,思路都很清楚,本地测试用例没问题,但是就不能完全AC
点赞
送花
回复
分享
发布于 2019-09-26 22:36
第二题leetcode 644,一样的题,二分法
点赞
送花
回复
分享
发布于 2019-09-27 07:25

相关推荐

点赞 5 评论
分享
牛客网
牛客企业服务