P1206 [USACO1.2] 回文平方数 Palindromic Squares
思路
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;
}
如有错误,欢迎大家评论区指出!感谢!