2022.3.29(题解

洛谷题题解

P1014 [NOIP1999 普及组] Cantor 表

链接:https://www.luogu.com.cn/problem/P1014
在这里插入图片描述
思路:此题为模拟枚举题,由题每项编号按照原表Z字型展开,那么我们可以转换一下原表:

第1层1/1
第2层1/2 2/1
第3层3/1 2/2 1/3
第4层1/4 2/3 3/2 4/1
第5层5/1 4/2 3/3 2/4 1/5

由上表我们可以得到三个信息,
1、第i层有i项数据
2、且每层都比上一层多一项,
3、奇数层数据从大到小,偶数层数据从小到大 。
那么
题目所求第N项数据,我们可以通过循环枚举先求出第N项在第几层第几个,在通过判断奇偶性,判断该层是正序还是逆序,确定第N项数据

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int main()
{
    scanf("%d",&n);
    int t=1;//当前层数与当层数据数
    while(n>t)
    {
        n=n-t;t++;
    }
    //while循环结束后,n代表的是在t层的第n个数据(就是所求值)
    //通过判断该层(t层)的奇偶性,得出数据顺序,最后求值
    if(t%2==0) printf("%d/%d",n,t+1-n);
    else printf("%d/%d",t+1-n,n);
    return 0;
}

P1031 [NOIP2002 提高组] 均分纸牌

链接:https://www.luogu.com.cn/problem/P1031
在这里插入图片描述
思路:简单化就是求平均数,把每堆纸牌与平均数相比较,第i堆少了从第i+1堆拿,多了就往第i+1堆放,但是需要注意的一点是,若第i堆刚好就是等于平均数,那直接跳过这堆,去比较后面的

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[150];
int sum,c;
int main()
{
	//输入
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    //平均数
    sum/=n;
    int t=0;
    for(int i=1;i<n;i++)
    {
    	//若这堆纸牌与平均数不等,则需要进行移动(从后面那堆补或者把多的放到后面那堆
        if(a[i]!=sum) {
        a[i+1]+=a[i]-sum;
        //C变量记录移动次数
        c++;
        }
    }
    printf("%d",c);
    return 0;
}

P1100 高低位交换

链接:https://www.luogu.com.cn/problem/P1100
在这里插入图片描述
思路:
提取该正整数的前16位和后16位,再通过按位或(|)进行组合即可

#include<iostream>
#include<cstdio>
using namespace std;
unsigned long long a,b,c;
int main()
{
    cin>>a;
    b=(a&0x0000ffff)<<16;//提取后十六位
    c=(a&0xffff0000)>>16;//提取前十六位
    a=b|c;//重新组合
    cout<<a;
    return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值