数据过过过过过过过过过过过过过过过过过过过过过过水
查看原帖
数据过过过过过过过过过过过过过过过过过过过过过过水
991813
sen_lin114514楼主2024/12/27 20:03

以下代码,无法通过样例2,但提交100分。

#include <iostream>
#include <cstring>
#include <queue>
#define int unsigned long long

using namespace std;

const int N = 514514;

struct node
{
	int to,w,nxt;
}edge[N];
int head[N];

int cnt = 1;

void add(int u,int v,int w)
{
	edge[cnt].to = v;
	edge[cnt].w = w;
	edge[cnt].nxt = head[u];
	head[u] = cnt;
	cnt ++;
}

int n,m;

int d[N];
int flag[N];

int h,x,y,z;

void init()
{
	for (int i = 0 ; i <= x + 5; i ++)
	{
		d[i] = (1ull << 63) - 1;
	}
}

void spfa(int p)
{
	init();
	memset(flag,0,sizeof(int) * (x + 5));
	queue<int> q;
	d[p] = 0;
	q.push(p);
	//ccnt[p] ++;
	flag[p] = true;
	while (!q.empty())
	{
		int u = q.front();
		q.pop();
		flag[u] = false;
		for (int i = head[u] ; i != 0 ; i = edge[i].nxt)
		{
			int v = edge[i].to;
			int w = edge[i].w;
			//std :: cout << u << " " << w << " " << v << "\n";
			if (d[v] > d[u] + w)
			{
				//std :: cout << v;
				d[v] = d[u] + w;
				if (!flag[v])
				{
					flag[v] = true;
					q.push(v);
//					ccnt[v] ++;
//					if (ccnt[v] > n)
//					{
//						return true;
//					}
				}
			}
		}
	}
}

signed main()
{
	std :: cin >> h >> x >> y >> z;
	if (x == 1 || y == 1 || z == 1)
	{
		std :: cout << h << "\n";
		return 0;
	} 
	h --;
	//int t = std :: min(min(x,y),z);
	for (int i = 0 ; i < x ; i ++)
	{
		add(i,(i + y) % x,y);
		add(i,(i + z) % x,z);
		//printf("(%d+%d)mod%d=%d\n",i,y,x,(i + y) % x);
		//printf("(%d+%d)mod%d=%d\n",i,z,x,(i + z) % x);
	}
	spfa(0);
	long long ans = 0;
	//for (int i = 0 ; i < x ; i ++) std :: cout << d[i] << " ";
	for (int i = 0 ; i < x ; i ++)
	{
		if (d[i] <= h) 
		{
			ans += (h - d[i]) / x + 1;
			//ans +=(h -dis[i])/x +1;
		}
		
		//ans += ((unsigned long long)(h - i) / (unsigned long long)(x + 1)) - ((unsigned long long)(d[i] - i) / (unsigned long long)(x + 1));
	}
	std :: cout << ans;
} 

求大佬答疑解惑

2024/12/27 20:03
加载中...