Uva11300 - Spreading the Wealth

16 篇文章 0 订阅

题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2275


题目大意:n个人围成一个圆,每个人有一定的金币数量,然后每个人与左右两边的人交换硬币,这里注意,每个人只能和左右两边的人交换硬币,然后经过一些交换,最终使得每个人的金币数量相同。


这道题初看觉得很复杂,想到的方法也很复杂,后来看了书上的解析,发现有非常好处理的方法。

首先算出最终每个人持有的金币数量,就是金币总数/人数n=M;

然后开始分析,设每个人初始拥有的金币数量是A[i];

这里设每个人按照逆时针方向给旁边的人金币,例1号给n号x1个金币,x1>0,说明是1号给了n号x1个金币,若<0,说明是n号给了1号-x1个金币,以此类推,

2号给了1号x2个金币,3号给了2号x3个金币,4号给了3号x4个金币。。。n号给了n-1号xn个金币;

因此经过交换,1号最后的金币数量就是A[1]-x1+x2=M;x2=x1+M-A[1]=x1-(A[1]-M)=x1-C1,令A[1]-M=C1;

2号是A[2]-x2+x3=M;x3=x2+M-A[2]=(x1+M-A[1])+M-A[2]=x1+2M-A[1]-A[2]=x1-(A[1]+A[2]-2M)=x1-C2;C2=A[1]+A[2]-2M=C1+A[2]-M;

以此类推,3号就是A[3]-x3+x4=M;即x4=x1-C3;C3=C2+A[3]-M;

。。。

对第n-1个人,就是A[n-1]-X(n-1)+Xn=M;即Xn=x1-Cn-1;

 对第n个人,A[n]-Xn+X1=M;这个式子对于运算没有意义。


根据题意,求的就是|X1|+|X2|+...+|Xn|的最小值,即|X1|+|X1-C1|+|X1-C2|+......+|X1-C(n-1)|的最小值;


而在几何意义上看,将C1,C2。。。Cn-1看作数轴上分布的一些点,那么|x1-Ci|就是求点x1到Ci的距离;

而|X1|+|X1-C1|+|X1-C2|+......+|X1-C(n-1)|就转换成了:给定数轴上n个点,找一个到他们距离之和最小的点;

而这个点,就是中位数;

所以这道题的算法就是,求出C1,C2...Cn之后,将它们重新排序,然后找出中位数;

找这个中位数与n的奇偶无关,直接找到C(n/2)就是找到了x1;因为当n为奇数时,中间那个数就是中位数这没问题;

而当n为偶数的时候,x1可以在这个数列中间两个数之间任意一个地方,因为当这个数偏向左边的时候,他到左边的距离减少了,但是到右边的距离又增加了;偏向右边同理。

所以x1就是C(n/2);


然后算出x1到每个点的绝对值相加,就是最终答案了。


这个题目我按照这个思路写完了代码自己测试的都没有问题,但是得到的总是WA,然后发现了一个问题;

这个问题和算法思路无关,和输入输出有关,这道题要求输入的值保证在64位无符号整数范围内;

所以我用的变量格式是long long ,到这里都没有什么问题,问题就在scanf和printf的格式上!!我刚开始用的是%I64d,一直都AC不了,然后折腾了好久之后。。。用了%lld就可以AC了......


代码如下:


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define maxn 1000200
long long a[maxn],c[maxn];
int cmp(const void*a,const void*b)
{
	return *(int*)a-*(int*)b;
}
int main(int argc, char *argv[]) 
{
	long long sum,mid,x1,y;
	int n,i;
	while(scanf("%d",&n)!=-1)
	{
		sum=0;
		for(i=1;i<=n;i++)
		{
			scanf("%lld",&a[i]);
			sum+=a[i];
		}
		mid=sum/n;
		c[0]=0;
		for(i=1;i<n;i++)
		{
			c[i]=c[i-1]+a[i]-mid;
		}
		qsort(c,n,sizeof(c[0]),cmp);
		x1=c[n/2];
		y=0;
		for(i=0;i<n;i++)
		{
			y+=abs(x1-c[i]);
		}
		printf("%lld\n",y);
	}
	return 0;
}


等我  鞍啊大叔点


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是ESP32-IDF中使用LoRa进行休眠和唤醒的示例代码: ``` #include "esp_sleep.h" #include "driver/gpio.h" #include "esp_log.h" #include "driver/spi_master.h" #include "sx1276.h" #define SPI_MISO_PIN GPIO_NUM_19 #define SPI_MOSI_PIN GPIO_NUM_27 #define SPI_SCLK_PIN GPIO_NUM_5 #define SPI_CS_PIN GPIO_NUM_18 #define LORA_RESET_PIN GPIO_NUM_14 #define LORA_DIO0_PIN GPIO_NUM_26 #define LORA_DIO1_PIN GPIO_NUM_33 #define LORA_DIO2_PIN GPIO_NUM_32 #define LORA_BANDWIDTH 0 #define LORA_SPREADING_FACTOR 7 #define LORA_CODING_RATE 1 #define LORA_SYNC_WORD 0x12 static const char *TAG = "lora_sleep_wakeup"; spi_device_handle_t spi; void lora_sleep() { ESP_LOGI(TAG, "Entering LoRa sleep mode..."); sx1276_set_standby(spi); esp_sleep_enable_ext0_wakeup(LORA_DIO0_PIN, 0); esp_sleep_enable_ext1_wakeup(1ULL << LORA_RESET_PIN, ESP_EXT1_WAKEUP_ANY_HIGH); esp_deep_sleep_start(); } void lora_wakeup() { ESP_LOGI(TAG, "Waking up from LoRa sleep mode..."); gpio_set_direction(LORA_RESET_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LORA_RESET_PIN, 0); vTaskDelay(pdMS_TO_TICKS(1)); gpio_set_level(LORA_RESET_PIN, 1); vTaskDelay(pdMS_TO_TICKS(10)); sx1276_init(spi, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODING_RATE, LORA_SYNC_WORD, LORA_DIO0_PIN, LORA_DIO1_PIN, LORA_DIO2_PIN); } void app_main() { spi_bus_config_t spi_bus_cfg = { .mosi_io_num = SPI_MOSI_PIN, .miso_io_num = SPI_MISO_PIN, .sclk_io_num = SPI_SCLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 0, }; spi_device_interface_config_t spi_dev_cfg = { .clock_speed_hz = 10000000, .mode = 0, .spics_io_num = SPI_CS_PIN, .queue_size = 1, }; esp_err_t ret = spi_bus_initialize(HSPI_HOST, &spi_bus_cfg, 1); assert(ret == ESP_OK); ret = spi_bus_add_device(HSPI_HOST, &spi_dev_cfg, &spi); assert(ret == ESP_OK); sx1276_init(spi, LORA_BANDWIDTH, LORA_SPREADING_FACTOR, LORA_CODING_RATE, LORA_SYNC_WORD, LORA_DIO0_PIN, LORA_DIO1_PIN, LORA_DIO2_PIN); while (1) { ESP_LOGI(TAG, "Sending LoRa packet..."); sx1276_send_packet(spi, "Hello, LoRa!", strlen("Hello, LoRa!")); lora_sleep(); lora_wakeup(); } } ``` 在这个示例代码中,我们使用ESP32的Deep Sleep功能和外部中断来实现LoRa的休眠和唤醒。在进入休眠模式之前,我们通过调用`sx1276_set_standby`函数将LoRa芯片设置为待机模式,并使用`esp_sleep_enable_ext0_wakeup`和`esp_sleep_enable_ext1_wakeup`函数来启用外部中断唤醒。在唤醒时,我们首先将LoRa芯片复位,然后重新初始化它。 同时,需要注意的是,在进入Deep Sleep模式之前,我们还需要将LoRa芯片从SPI总线上断开,以避免在Deep Sleep期间消耗电力。在唤醒时,我们需要重新连接LoRa芯片到SPI总线上,并重新初始化它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值