ECJTU ACM18级队员寒假训练赛

本文解析了ECJTUACM18级队员寒假训练赛中A题和H题的算法实现。A题关注于数字序列的划分与求和差的最小值,通过数学分析给出简洁的解决方案;H题探讨了圆桌逆序求解最少交换次数的策略,利用特定公式计算最优解,提供了一个高效解决此类问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ECJTU ACM18级队员寒假训练赛

~

A题
题意:将一个从1到n的数字序列分成2个序列
求出两个序列之和的绝对值之差的最小值
输出这个最小值

/这道题的意思很明显如果从1到n加起来为整数的话那么怎样都能平分成
2个加起来和相同的序列,如果加起来是奇数,那么一定存在2个序列他们的和的差为1

`#include<stdio.h>
int main()
{
 int a;
 long long n;//注意到如果用int型数据可能数据会爆
 scanf("%lld",&n);
 long long ans=n*(n+1)/2;
 if(ans%2==0)//用单精度或者双精度无法进行取余计算
 a=0;
 else
 a=1;
    printf("%d",a);
 return 0; 
}

H题
圆桌逆序求n个人交换次数最少,输出最少次数
题目要点:将圆桌分成2行人,再进行排序
类似与冒泡排序的最坏情况
而其最坏情况存在一个最少交换次数公式
即sum=n*(n-1)/2
分成2行即两行人数相同或者相差一位的时候为最大
可利用上面的公式进行推导
可得出一个函数求出最小值为两者相等的时候

#include<stdio.h>
int main()
{
 int n,b,a;
 while(scanf("%d",&n)!=EOF)
 {
    a=n/2;
    b=n-a;
  printf("%d\n",a*(a-1)/2+b*(b-1)/2);
    }
  return 0; 
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值