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

例题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
必要的存储量
下面哪些题目可以不借助数组
输入一些数,统计个数……肯定不用
输入一些数,求最大值最小值平均数……肯定不用
输入一些数,哪两个数最接近……这个应该要用吧?。。
输入一些数,求第二大的值……这个可以不用
输入一些数,求方差……应该要用
输入一些数,统计不超过平均数的个数……应该要用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值