Worker

Worker

Avin meets a rich customer today. He will earn 1 million dollars if he can solve a hard problem. There are n warehouses and m workers. Any worker in the i-th warehouse can handle ai orders per day. The customer wonders whether there exists one worker assignment method satisfying that every warehouse handles the same number of orders every day. Note that each worker should be assigned to exactly one warehouse and no worker is lazy when working.

Input

The first line contains two integers n (1 ≤ n ≤ 1, 000), m (1 ≤ m ≤ 1018). The second line contains n integers. The i-th integer ai (1 ≤ ai ≤ 10) represents one worker in the i-th warehouse can handle ai orders per day.

Output

If there is a feasible assignment method, print "Yes" in the first line. Then, in the second line, print n integers with the i-th integer representing the number of workers assigned to the i-th warehouse.
Otherwise, print "No" in one line. If there are multiple solutions, any solution is accepted.

Sample Input

2 6
1 2
2 5
1 2

Sample Output

Yes
4 2
No

每个房间需要的工人数目和工人在该房间工作的时间成反比的,按比例分配人数即可。比如第一组样例,第一个房间里面工人工作时间为第二个房间里的1/2,所以第一个房间所需要工人数为第二个房间的二倍。输出NO的情况就是人数无法分配,即所占比例乘以总人数后不是整数。

(这个题开始一直runtime error(integer divide by zero),就是求比例时候,要除以总份数sum。sum初始化为0,但明明求完sum后它不可能为0啊,然后就替换一下就行了,amazing!)

#include<bits/stdc++.h>

using namespace std;
const int maxn = 1e5+10;
long long gcd(long long x,long long y){
	return y == 0?x:gcd(y,x%y);
}
long long lcm(long long x,long long y){
	return x/gcd(x,y)*y;
}
int main()
{
	long long n,m;
	cin >> n >> m;
	long long  a[maxn];
	for(int i = 0;i < n;i ++)
		cin >> a[i];
	long long lcmm = lcm(a[0],a[1]);	
	for(int i = 2;i < n;i ++){	
		lcmm = lcm(lcmm,a[i]);
	}
	long long sum = 0;
	for(int i = 0;i < n;i ++){
		sum += lcmm/a[i];
	}
	long long t = sum;//防止出现runtime error(integer divide by zero) 
	long long  x = 0, c[maxn];
	for(int i = 0;i < n;i ++){
		c[x ++] = (lcmm/a[i])*m/t;
	}
	int flag = 0;
	for(int i = 0;i < n;i ++){
		if(c[i] * t != (lcmm/a[i])*m) flag = 1;
	}
	if(flag == 1) cout << "No";
	else{
		cout << "Yes" << endl;
		for(int i = 0;i < n;i ++){
			if(i != n-1)
			  cout << (lcmm/a[i])*m/t << " ";
			else cout << (lcmm/a[n-1])*m/t;
		}
	}
	cout << endl;
	return 0;
}

 

07-23
在IT领域中,"worker"一词可以指代多种不同的技术概念,具体取决于上下文。以下是一些常见的与"worker"相关的技术信息: ### Web Workers 在Web开发中,Web Worker 是一种允许在浏览器后台线程中运行脚本的技术,这样可以在不干扰用户界面的情况下执行长时间任务。Web Workers 提供了多线程的能力,使得复杂的计算可以在一个独立的线程中进行,而不会阻塞主线程。这有助于提高应用程序的响应性和性能。 Web Worker 的基本使用方式如下: ```javascript // 创建一个新的Worker对象,并传入要执行的脚本URL const myWorker = new Worker('worker.js'); // 向Worker发送消息 myWorker.postMessage('Hello from main thread'); // 接收来自Worker的消息 myWorker.onmessage = function(event) { console.log(`Message from worker: ${event.data}`); }; ``` 在 `worker.js` 文件中,你可以编写如下代码来处理消息: ```javascript // 监听来自主线程的消息 onmessage = function(event) { console.log(`Message received from main thread: ${event.data}`); // 发送回一个响应 postMessage('Hello back from worker thread'); }; ``` ### 系统工作进程 (System Worker Processes) 在操作系统层面,系统工作进程通常指的是那些负责执行特定任务的服务或守护进程。例如,在Windows服务中,`WorkerRole` 类可能代表了一个长时间运行的角色入口点,它继承自 `RoleEntryPoint` 并重写了 `Run` 方法以实现持续工作的逻辑。这类进程往往会在启动时初始化一些资源,并且在运行期间保持活跃状态来处理任务[^1]。 ### 线程实现中的Worker 在线程编程中,尤其是使用 .NET Framework 进行开发时,开发者可能会创建后台线程作为worker线程来执行非关键性的任务。需要注意的是,如果程序终止时这些worker线程仍在运行,则它们的 `finally` 块(用于清理工作的)将不会被执行。为避免这种情况,可以通过调用 `Join` 方法等待线程完成或者使用事件等待句柄来确保所有后台线程正确结束后再退出应用程序[^2]。 ### 特定框架/库中的Worker实现 某些框架和库提供了自己的worker实现来简化并发和异步编程。比如,在.NET中,异步委托、BackgroundWorker 组件以及任务并行库(TPL)都提供了一定程度上的自动异常处理机制,这减少了开发者需要手动管理线程和异常的情况[^3]。 ### 线程池 线程池是另一种形式的worker实现,它通过维护一组预先创建的可复用线程来减少线程创建和销毁带来的开销。线程池能够根据需要分配任务给空闲线程,同时控制最大并发线程数以防止资源耗尽。这种方式不仅提高了应用程序的响应速度,还优化了系统资源的利用效率[^4]。 以上内容涵盖了Web开发中的Web Worker、系统级的工作进程、线程实现以及特定框架或库中的worker实现。每种类型的worker都有其特定的应用场景和技术细节,选择合适的worker模型对于构建高效稳定的应用程序至关重要。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值