洛谷题题解
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;
}