添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

You are given N baskets of gold coins. The baskets are numbered from 1 to N. In all except one of the baskets, each gold coin weighs w grams. In the one exceptional basket, each gold coin weighs w-d grams. A wizard appears on the scene and takes 1 coin from Basket 1, 2 coins from Basket 2, and so on, up to and including N-1 coins from Basket N-1. He does not take any coins from Basket N. He weighs the selected coins and concludes which of the N baskets contains the lighter coins. Your mission is to emulate the wizard's computation. Input The input file will consist of one or more lines; each line will contain data for one instance of the problem. More specifically, each line will contain four positive integers, separated by one blank space. The first three integers are, respectively, the numbers N, w, and d, as described above. The fourth integer is the result of weighing the selected coins. N will be at least 2 and not more than 8000. The value of w will be at most 30. The value of d will be less than w. Output For each instance of the problem, your program will produce one line of output, consisting of one positive integer: the number of the basket that contains lighter coins than the other baskets. Sample Input 10 25 8 1109 10 25 8 1045 8000 30 12 959879400 Sample Output 2 10 50

你得到N篮金币。篮子的编号从1到n,除了一个篮子外,每个金币重w克。在一个特殊的篮子里,每枚金币重量为w-d克。一个巫师出现在场景中,从篮子1中取出1枚硬币,从篮子2中取出2枚硬币,以此类推,直到并包括从篮子N-1中取出N-1枚硬币。他不会从篮子里拿任何硬币。他会称出所选的硬币,并得出结论:在N个篮子里,哪一个篮子里的硬币较轻。您的任务是模拟向导的计算。

输入文件将由一行或多行组成;每行将包含问题的一个实例的数据。更具体地说,每行将包含四个正整数,由一个空格分隔。前三个整数分别是数字N、w和d,如上所述。第四个整数是称重所选硬币的结果。

N至少是2,不超过8000。w的值最多为30。d的值小于w。

对于问题的每个实例,您的程序将生成一行输出,其中包含一个正整数:包含比其他篮子更轻硬币的篮子的数量。

10 25 8 1109
10 25 8 1045
8000 30 12 9599400

思路:暴力破解,按顺序从1到N-1,假设它是特殊的篮子,进行求和,如果求和结果跟输入的相同,就说明假设成立,如果假设都不成立,因为没考虑最后一个(N),说明N是特殊的篮子,另外,N<8000,涉及到大数加法,这里是用char*字符串进行模拟,用string操作简单一些

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* trans(char a[]) {			//字符串倒叙
	char ch;
	for (int i = 0; i < strlen(a)/2; i++) {
		ch = a[i];
		a[i] = a[strlen(a) - i - 1];
		a[strlen(a) - i - 1] = ch;
	return a;
char* add(char a[], char b[])	{		//把2个字符串相加
	while (strlen(a) != strlen(b)) {
		int al = strlen(a), bl = strlen(b);
		if (al > bl) 
			b[bl] = '0';
			a[al] = '0';
		a[al+1] = b[bl+1] = '\0';
	a[strlen(a)]=b[strlen(b)] = '\0';
	int up = 0, sum;		//up储存进位
	char c[1000];
	int i = 0;
	for ( ; i < strlen(a); i++) {   //使用字符串模拟大数加法
		sum = a[i] - '0' + b[i] - '0' + up;
		up = sum / 10;
		sum %= 10;
		c[i] = char(sum+'0');
		c[i + 1] = '\0';
	if (up > 0) {
		c[i] = up + '0';
		c[i + 1] = '\0';
	return c;
int main(){
	int N, w, d;
	char sum[1000]="0", result[1000];
	int flag;						//用于记录是否有假设成立
	char tmp[1000];
	while (1) {
		flag = 1;
		scanf("%d%d%d%s", &N, &w, &d, &result);
		int i = 1;
		for (; i < N; i++) {		//假设第i个篮子是特殊的
			strcpy(sum, "0");		//重置sum
			for (int j = 1; j < N; j++) {
				if (i == j)
					itoa((w - d)*j, tmp, 10);
					itoa(w*j, tmp, 10);
				strcpy(sum, trans(add(trans(sum), trans(tmp))));
			if (strcmp(sum, result) == 0) {
				flag = 0;
				printf("%d\n", i);
				break;
		if (flag) 
			printf("%d\n", N);
	return 0;
                             You are given N baskets of gold coins. The baskets are numbered from 1 to N. In all except one of the baskets, each gold coin weighs w grams. In the one exceptional basket, each gold coin wei...
				
  由于有一个重要的Rar文件,极需解开,首先试用了ARPC,但是解压的速度极慢,每秒只有30个左右,所以断了穷举破解的念头,却仍不死心,因为我从不崇尚穷举破解的方法,除非每秒可以跑几千万次的,我或许可以一试,所以决定研究一下Winrar 3.x密码算法,以期是否可以破解该密码。查看了网络上的资料,包括看雪FAQ里的回答,都声称只能用穷举法破解,起先并不理解,但通过研究,我理解了看雪前辈们在FAQ里所说的原因,不禁让我佩服 Winrar加密思路的成熟。虽然研究的结果没有什么新意,但我还是决定把我的研究结果与
前几天在玩解数独游戏时,发现有点费时间。心血来潮想实现一个解数独的c语言程序,根据我在晚解数独游戏的思路,采用了暴力算法求解。在数组维数的选择上,我选择了用一维数组实现。 其实暴力算法求解的实际是,将求解数组的思路,整合成代码,通过代码告诉计算机,让计算机按我们的想法来工作。 首先,9*9数独的规则是,每行九个数各不相同,每列九个数各不相同,每个小九宫格的九个数各不相同。例如下图(图片源于网络,侵删): 暴力算法的实际就是,对81个小格里面待填元素逐一填值(1-9),符合则填入,九个数字都不符 各位,大家看到标题先别着急,我先大伙聊聊密码破解的事,后面会有C语言的破解案例。 现代密码学发展到今天,应该来讲破解密码的可能性已经很低了,而且破解的方法比较单一,因为现在普遍采取不可逆的哈希加密方式(如md5、SHA-1、HMAC-MD5等等),无法通过反向计算破解密码,因此目前有效的密码破解方式仍然是哈希碰撞来暴力破解暴力破解的本质就是遍历所有可能...
小蓝在一张无限大的特殊画布上作画。 这张画布可以看成一个方格图,每个格子可以用一个二维的整数坐标表示。 小蓝在画布上首先点了一下几个点:(0, 0), (2020, 11), (11, 14), (2000, 2000)。只有这几个格子上有黑色,其它位置都是白色的。 每过一分钟,黑色就会扩散一点。具体的,如果一个格子里面是黑色,它就会扩散到上、下、左、右四个相邻的格子中,使得这四个格子也变成黑色如果原来就是黑色,则还是黑色)。 请问,经过 2020 分钟后,画布上有多少个格子是黑色的。 结果:2031208
### 回答1: educoder生产者消费者问题实践是一种经典的多线程编程问题,旨在通过生产者和消费者之间的协作来实现数据的安全共享。在这个问题中,生产者负责生产数据并将其放入缓冲区中,而消费者则负责从缓冲区中取出数据并进行消费。为了保证数据的安全共享,需要使用同步机制来避免生产者和消费者之间的竞争条件和死锁等问题。通过实践这个问题,可以加深对多线 ### 回答2: 生产者消费者(Producer-Consumer)问题是计算机领域中的经典问题,主要围绕着线程同步问题展开。在educoder上有一道题目关于生产者消费者问题的实践题目,我们需要通过编程来实现一个基于生产者消费者模型的程序。 在本题目中,我们需要编写一个程序,该程序运行包含两个线程,一个是生产者线程,一个是消费者线程,他们需要同时运行。生产者线程会不断的生产商品并添加到一个“篮子”中,消费者线程则会从这个“篮子”中取出商品进行消费。如果篮子中已经有了商品,那么生产者就需要等待,直到消费者消费了一些商品,并释放了“篮子”空间。 在解决这个问题的时候,我们需要用到共享资源的概念。在本题目中,我们将“篮子”的空间看做是一个共享资源,需要互斥地被生产者和消费者访问。因此,我们需要使用一些操作系统提供的同步机制,例如锁,信号量等来保证线程之间的同步与互斥。 具体实现的方法如下:首先,我们需要定义一个“篮子”类,其内部需要定义一个商品队列,以及必要的状态锁,信号量等。然后,我们需要在主函数中创建生产者和消费者线程,并将“篮子”对象作为参数传递给这两个线程。生产者线程会在一个 while 循环中不断地生产商品,将商品添加到“篮子”队列中,并通知消费者线程有新的商品可以消费;消费者线程则会在一个 while 循环中不断地从“篮子”队列中取出商品进行消费,如果队列为空,则会等待生产者线程通知有新的商品到来。 总的来说,这个实践题目帮助我们更好的理解了生产者消费者模型,并加深了我们对线程同步机制的理解和运用技能。 ### 回答3: 生产者消费者问题是一种经典的并发编程问题,在并发编程中经常遇到。该问题的主要目的是协调“生产者”和“消费者”的操作,使得它们能够有序地进行操作,不会发生死锁或饥饿等问题。在Educoder生产者消费者问题实践中,通过理论学习和实践操作,我对该问题有了更深入的理解。 首先,我们知道,生产者负责生产物品并将其放置在缓冲区,消费者则从缓冲区中取出物品进行处理。因此,在实践中,我们需要考虑如何保证缓冲区的线程安全性。在Educoder的实践中,我通过Semaphore信号量进行了操作。Semaphore是一种计数信号量,用于保护共享资源,可以指定一个计数值,其中生产者可以增加计数值,消费者可以减少计数值,当计数值为0时,消费者必须等待,直到有生产者增加计数值。 其次,在实践中,我们还需要考虑如何避免死锁和饥饿问题。由于生产者和消费者的操作互相依赖,在多线程操作中容易产生死锁的情况,因此我们需要采取相应的策略来避免死锁情况的发生。在Educoder的实践中,我采用了先生产后消费的策略,确保在生产者将物品放入缓冲区之后,消费者才能进行取出和处理。此外,我还采用了公平锁来避免饥饿问题的发生,保证了每个线程都有机会参与执行。 总之,在Educoder生产者消费者问题的实践中,我学习了并发编程的基础知识,并通过实践操作加深了对Semaphore的理解。通过理论结合实践,我对生产者消费者问题有了更深入的认识,同时也掌握了更多的编程技巧和策略,为以后的并发编程操作奠定了更加坚实的基础。