1-316作业

P1097 [NOIP2007 提高组] 统计数字

P1100 高低位交换

P1206 [USACO1.2] 回文平方数 Palindromic Squares

P1881 绳子对折

P1958 上学路线

思路 

P1097

读入数字,直接sort掉,这样就能保证自然数是从小到大的,一旦发现这个数字与前面的不一样,就要输出。特别注意i=1时不要输出,最后补上最后一个数字。

#include<bits/stdc++.h>
using namespace std;
int n,s=1;
long long a[200001];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		if(a[i]==a[i-1]){
			s++;
		}
		if(a[i]!=a[i-1]&&i>1){
			cout<<a[i-1]<<" "<<s<<endl;
			s=1;
		}
	}
	cout<<a[n]<<" "<<s;
    return 0;
}

 P1100

仔细读题,所谓的“交换”,其实就是把前16位后移,把后16位前移而已,因此我们只需把每一位分离出来即可

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long a,s=0,x=0;
	cin>>a;
	while(a)
    {
		if(a%2==1)
		{
			if(x<16)
			{
				s+=pow(2,x+16);
			}
			else
			{
				s+=pow(2,x-16);
			}
		}
		a/=2;
		x++;
	}
	cout<<s;
	return 0;
}

 P1206

1.枚举,将i的平方转换为x进制字符串s;

2.判断是否为回文;

3.是根据第二步结果,输出i的b进制字符串和i*i的b进制字符串。 

#include<bits/stdc++.h>
using namespace std;
char c[40]={"0123456789ABCDEFGHIJKLMNOPQRSTUVWHYZ"};
bool h(int m,int x)
{
    string s="";
    int n=m;
	while(n!=0)
	{
		int t=n%x;
		s+=c[t];
		n/=x;
	}
	reverse(s.begin(),s.end());
	for(int i=0; i<s.size(); i++)
	{
	    if(s[i]!=s[s.size()-i-1])
	    {
	        return 0;
	    }
	}
	return 1;
}
string p(int n,int x)
{
    string s="";
	while(n!=0)
	{
		int t=n%x;
		s+=c[t];
		n/=x;
	}
	reverse(s.begin(),s.end());
	return s;
}
int main()
{
    int b;
    cin>>b;
    for(int i=1;i<=300;i++)
    {
        int n=i*i;
        if(h(n,b))
        {
            cout<<p(i,b)<<" "<<p(n,b)<<endl;
        }
    }
    return 0;
}

 P1881

1.将长度 l∗2,储存时将所有结的位置也∗2

2.从对折点依次向两端枚举,遇到数值不同的两个位置(即一个点是结,另一个点不是结)判定合法

 

#include<bits/stdc++.h>
using namespace std;
int n,l,p,r[20004],h;
int main()
{
	cin>>n>>l;
	for(int i=1;i<=n;i++)cin>>p,r[p*2]=1;
	for(int i=1;i<2*l;i++)
    {
        int p=1,s=0;
		while(i>=s&&i+s<=2*l)
		{
			if(r[i-s]!=r[i+s])p=0;
			s++;
		}
		h+=p;
	}
	cout<<h;
	return 0;
}

P1958

典型的走迷宫的问题,我们先从1,1开始,把1,1入队,依次去扩展右,下的节点,如果右,下越界了,或者是设有障碍物,那么也就是说这个点不能扩展(这个是判断的条件,很重要),如果当前所扩展完的点合法,那么让它入队,如果扩展点为a,b那么我们就记录

 

#include<bits/stdc++.h>
using namespace std;
int a,b,k,x,y,s;
bool h[20][20];
void d(int x,int y)
{
    if(x==a&&y==b)
    {
        s++;
        return;
    }
    if(h[x][y+1])d(x,y+1);
    if(h[x+1][y])d(x+1,y);
}
int main()
{
    cin>>a>>b;
    for(int i=1;i<=a;i++)
    {
        for(int j=1;j<=b;j++)
        {
            h[i][j]=true;
        }
    }
    cin>>k;
    while(k--)
    {
        cin>>x>>y;
        h[x][y]=false;
    }
    d(1,1);
    cout<<s;
    return 0;
}

 如有错误,欢迎大家评论区指出!感谢!

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值