依图笔试 算法第二套笔试题, AC前三题

第一题,收费站, 用的双指针, AC
#include <stdio.h>
#include <string.h>
#include <vector>
#include <iostream>
using namespace std;
const int N = 1000 + 10;
int a[N];
int b[N];
int main()
{
	int n;
	cin >> n;
	int idx1 = -1;
	int idx2 = -1;
	for(int i = 0; i < n; ++i)
	{
		cin >> a[i];
		if(a[i] > 0 && idx1 == -1)
		{
			idx1 = i;
		}
	}
	for(int i = 0; i < n; ++i)
	{
		cin >> b[i];
		if(b[i] > 0 && idx2 == -1)
		{
			idx2 = i;
		}
	}

	int ans = 0;
	while(idx1 < n && idx2 < n)
	{
		if(a[idx1] < b[idx2])
		{
			ans += a[idx1] * (idx2 - idx1);
			b[idx2] -= a[idx1];
			idx1 += 1;
		}
		else if(a[idx1] == b[idx2])
		{
			ans += a[idx1] * (idx2 - idx1);
			b[idx2] -= a[idx1];
			idx1 += 1;
			idx2 += 1;
		}
		else
		{
			ans += b[idx2] * (idx2 - idx1);
			a[idx1] -= b[idx2];
			idx2 += 1;
		}
		if(idx1 >= n || idx2 >= n)
			break;
	}
	cout << ans << endl;

}


第二题,时间最短,蛋糕最多,用的dijstkra, AC
#include <stdio.h>
#include <string.h>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
const int N = 10000 + 10;
const int M = 2000000 + 10;
typedef long long ll;
ll a[N];

struct edge 
{
	int v;
	int next;
	ll time;
}e[M];
int head[N];
int cnt = 0;
void add(int u, int v, int t)
{
	e[cnt].v = v;
	e[cnt].time = t;
	e[cnt].next = head[u];
	head[u] = cnt++;
}
ll times[N];
ll cakes[N];

struct node
{
	int fa;
	int u;
	ll time;
	friend bool operator<(const node &a , const node &b)
    {
        return a.time>b.time;   // ascending sort
    }
};

priority_queue<node> q;
void dij(int s, int d)
{
	node cur;

	memset(cakes, 0, sizeof(cakes));
	memset(times, -1, sizeof(times));

	for(int i = head[s]; i != -1;  i = e[i].next)
	{
		node tmp;
		tmp.fa = s;
		tmp.u = e[i].v;
		tmp.time = e[i].time;
		q.push(tmp);
	}
	cakes[s] = a[s];
	times[s] = 0;

	int i = 0;
	while(!q.empty())
	{
		i+=1;
		cur = q.top();
		q.pop();
		//没有走过, 或者有更好的走法
		if(times[cur.u] == -1 || cur.time < times[cur.u])
		{
			times[cur.u] = cur.time;
			cakes[cur.u] = cakes[cur.fa] + a[cur.u];
		}
		// 时间相同,选蛋糕更多的
		else if(cur.time == times[cur.u])
		{
			if(cakes[cur.fa] + a[cur.u] > cakes[cur.u])
				cakes[cur.u] = cakes[cur.fa] + a[cur.u];
			continue;
		}
		else
		{
			continue;
		}
		/* cout << cur.u << " " << cakes[cur.u] << endl; */


		for(int i = head[cur.u]; i != -1; i = e[i].next)
		{
			if(times[e[i].v] != -1 && cur.time + e[i].time > times[e[i].v])
				continue;
			node tmp;
			tmp.fa = cur.u;
			tmp.u = e[i].v;
			tmp.time = cur.time + e[i].time;
			q.push(tmp);
		}
	}
	cout << times[d] << " " << cakes[d] << endl;
}
int main()
{
	int n, m, s, d;
	cin >> n >> m >> s >> d;
	s--;
	d--;
	for(int i = 0; i < n; ++i)
	{
		cin >> a[i];
	}
	int u, v, t;
	memset(head, -1, sizeof(head));
	for(int i = 0; i < m; ++i)
	{
		cin >> u >> v >> t;
		u--;
		v--;
		add(u, v, t);
		add(v, u, t);
	}

	dij(s, d);

}
//6 80

第三题,统计3的个数, 将数字%3,余数为0,1,2,  只需对余数为1和2的数组进行相加。AC
#include <stdio.h>
#include <string.h>
#include <vector>
#include <iostream>
using namespace std;
const int N = 10000 + 10;
int cnt[4];
int main()
{
	int n, k;
	cin >> n >> k;
	for(int i = 0; i < n; ++i)
	{
		int x;
		cin >> x;
		x %= 3;
		cnt[x] += 1;
	}

	int ans = cnt[0];
	if(k <= min(cnt[1], cnt[2]))
	{
		ans += k;
	}
	else
	{
		/* ans += k; */
		k -= min(cnt[1], cnt[2]);
		int tmp = min(cnt[1], cnt[2]);
		ans += min(cnt[1], cnt[2]);
		cnt[1] -= tmp;
		cnt[2] -= tmp;

		if(cnt[1] < cnt[2])
		{

			if(cnt[2] / 3 > k)
			{
				ans += k / 2;
			}
			else
			{
				ans += min(cnt[2] / 3, k / 2);
				/* ans -= k; */	

			}
		}
		else// cnt[1] >= cnt[2]
		{
			if(cnt[1] / 3 > k)
			{
				ans += k / 2;
			}
			else
			{
				ans += min(cnt[1] / 3, k / 2);
				/* k -= cnt[1] / 3; */
				/* ans -= k; */
			}
		}
	}

	if(ans < 0)
		ans = 0;

	cout << ans << endl;



}

第四题,没看懂

#依图科技##笔试题目#
全部评论
第一题: #include<vector> #include<iostream> using namespace std; int main() { int n; cin >> n; vector<int> a(n), b(n); for (int i = 0;i < n;i++) cin >> a[i]; for (int i = 0;i < n;i++) cin >> b[i]; int sum1 = 0, sum2 = 0; for (int i = 0;i < n;i++) { sum1 += a[i] * i; sum2 += b[i] * i; } cout << sum2 - sum1 << endl; return 0; }
点赞 回复 分享
发布于 2019-08-23 21:36
太猛了老哥
点赞 回复 分享
发布于 2019-08-23 21:30
牛逼
点赞 回复 分享
发布于 2019-08-23 21:31
厉害了,老哥
点赞 回复 分享
发布于 2019-08-23 22:53

相关推荐

点赞 评论 收藏
分享
评论
2
19
分享
牛客网
牛客企业服务