您的位置:首页 > 其它

算法竞赛入门经典 第三章 学习笔记

2017-01-14 21:59 471 查看
例题3-1 开灯问题

#include <iostream>
using namespace std;
signed char light[1000+10];
int main()
{
int i,j,n,k;
cin>>n>>k;
for(i=0;i<1000+10;i++)
light[i] = -1;
for(i=1;i<=k;i++)
{
for(j=1;j<=n;j++)
{
if(j%i==0)
{
light[j-1] = -light[j-1];
}
}
}
cout<<1;
for(i=2;i<=n;i++)
{
if(light[i-1]==1)
cout<<' '<<i;
}
cout<<endl;
return 0;
}


例题3-2 蛇形填数

#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;
int main()
{
int a[10][10];
int n,cur,x,y,i,j;
cin>>n;
memset(a,0,sizeof(a));
cur = a[x=0][y=n-1] = 1;
while(cur<n*n)
{
while(x+1<n&&!a[x+1][y])
a[++x][y] = ++cur;
while(y-1>-1&&!a[x][y-1])
a[x][--y] = ++cur;
while(x-1>-1&&!a[x-1][y])
a[--x][y] = ++cur;
while(y+1<n&&!a[x][y+1])
a[x][++y] = ++cur;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(3)<<a[i][j];
}
cout<<endl;
}
}


例题3-3

#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;
int main()
{
int abc,de,x,y,z,i,cnt=0;
char in[20],buf[100];
cin>>in;
for(abc=100;abc<1000;abc++)
{
for(de=10;de<100;de++)
{
x = abc*(de%10);
y = abc*(de/10);
z = abc*de;
sprintf(buf,"%d%d%d%d%d",x,y,z,abc,de);
for(i=0;i<strlen(buf);i++)
{
if(strchr(in,buf[i])==NULL)
break;
}
if(i==strlen(buf))
{
cnt++;
cout<<'<'<<cnt<<'>'<<endl;
cout<<setw(5)<<abc<<endl;
cout<<'X'<<setw(4)<<de<<endl;
cout<<"-----"<<endl;
cout<<setw(5)<<x<<endl<<y<<endl;
cout<<"-----"<<endl;
cout<<z<<endl<<endl;
}
}
}
cout<<"The number of solutions = "<<cnt<<endl;
return 0;
}


习题3-4 回文串

#include <iostream>
#include <cstring>
#include <cctype>
using namespace std;
char in[5000+10],buf[5000+10];
int s[5000+10];
int main()
{
int l,i,j=0,k,max=0,pos1=0,pos2=0;
cin.getline(in,5000+10);
l = strlen(in);
for(i=0;i<l;i++)
{
if(isalpha(in[i]))
{
buf[j] = toupper(in[i]);
s[j] = i;
j++;
}
}
l = strlen(buf);
for(i=0;i<l;i++)
{
for(j=l-1;j>i;j--)
{
for(k=0;k<(j-i);k++)
{
if(buf[k+i]!=buf[j-k])
break;
}
if(k==j-i&&j-i>max)
{
max = j-i;
pos1 =s[i];
pos2 = s[j];
}
}
}
if(max==0)
{
cout<<"no string found";
return -1;
}
for(i=pos1;i<=pos2;i++)
cout<<in[i];
cout<<endl;
return 0;
}


3.4.1

必要的存储量

下面哪些题目可以不借助数组

输入一些数,统计个数……肯定不用

输入一些数,求最大值最小值平均数……肯定不用

输入一些数,哪两个数最接近……这个应该要用吧?。。

输入一些数,求第二大的值……这个可以不用

输入一些数,求方差……应该要用

输入一些数,统计不超过平均数的个数……应该要用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法