NOIP2008年普及组题解

这里是第一题的题干:https://www.luogu.org/problemnew/show/P1055
这道题,有点玄幻(不要问我为什么)
直接看代码吧(毕竟说多了都是伤心泪):

#include
#include
#include
#include
using namespace std;
string a;
int num=1,multiply=0;

int main()
{
    freopen("isbn.in","r",stdin);
    freopen("isbn.out","w",stdout);
    getline(cin,a);//这里很奇怪,在洛谷上面,这样是过不了的(cin>>a才行)。
    //但是,在lemon上面这样写是完全没有问题的。。。 
    int len=a.size();
    for(int i=0;i1;++i){
        if(a[i]>='0'&&a[i]<='9'){
            multiply+=(a[i]-48)*num;
            num++;
        }
    }
    int b=multiply%11;//先求出ISBN码里面最后一个数字原本应该是什么 
    if(b==10)
        b='X';
    if(b>=0&&b<=9){//判断是否相等的时候来了!!! 
        if(b==(a[len-1]-48)){
            cout<<"Right"<return 0;
        }
        else{
            a[len-1]=b;
            for(int i=0;i1;++i){
                cout<cout<else{//这是b原本为十的时候。。。 
        if(b==a[len-1]){
            cout<<"Right"<return 0;
        }
        else{
            a[len-1]=b;
            for(int i=0;i1;++i){
                cout<cout<<char(b)<return 0;
}

这是第二题的题目:https://www.luogu.org/problemnew/show/P1056
这道题,其实横着隔开与竖着隔开没有什么联系,所以我们可以分开来处理。只要用两个数组来存储横排与纵排的各个坐标上的会进行交头接耳的人,再将人数最多的K个与L个找出来,进行排序,马上就可以ACAC拉!!!
最后附上代码~~~

#include
#include
#include
#include
using namespace std;
int a[2500],a1[2500],b1[2500],b[2500];
int M,N,K,L,D,x1,x2,y1,y2;

void qsort(int l,int r)
{
    if(l>=r)
        return;
    int t=a1[rand()%(r-l+1)+l];
    int i=l,j=r;
    while(i<=j){
        while(a1[i]while(a1[j]>t)j--;
        if(i<=j){
            swap(a1[i],a1[j]);
            i++;
            j--;
        }
    }
    qsort(l,j);
    qsort(i,r);
}

void qsort2(int l,int r)
{
    if(l>=r)
        return;
    int t=b1[rand()%(r-l+1)+l];
    int i=l,j=r;
    while(i<=j){
        while(b1[i]while(b1[j]>t)j--;
        if(i<=j){
            swap(b1[i],b1[j]);
            i++;
            j--;
        }
    }
    qsort2(l,j);
    qsort2(i,r);
}

int main()
{
    freopen("seat.in","r",stdin);
    freopen("seat.out","w",stdout);
    cin>>M>>N>>K>>L>>D;
    for(int i=1;i<=D;i++){
        cin>>x1>>y1>>x2>>y2;
        if(x1!=x2){
            if(x1>x2)
                b[x2]++;
            else
                b[x1]++;
        }
        else if(y1>y2) 
            a[y2]++;
        else
            a[y1]++;
    }
    int max=0,x=0;
    for(int i=1;i<=K;i++){
        max=0,x=0;
        for(int j=1;j<=M;j++)
            if(b[j]>max){
                max=b[j];
                x=j;
            }
        a1[i]=x;
        b[x]=0;
    }
    for(int i=1;i<=L;i++)
    {
        max=x=0;
        for(int j=1;j<=N;j++)
            if(a[j]>max){
                max=a[j];
                x=j;
            }
        b1[i]=x;
        a[x]=0;
    }
    srand(10000000);
    qsort(1,K);
    for(int i=1;i<=K;i++)
        cout<" ";
    cout<1,L);
    for(int i=1;i<=L;i++)
        cout<" ";
    return 0;
}

到了第三题了:https://www.luogu.org/problemnew/show/P1057
简单的递推,不想讲什么东西了。。。这真的没有什么好讲的
直接上代码吧(个人觉得,比第一题都好做~~~)

#include
#include
using namespace std;
int n,m,a[50][50];

void prepare()
{
    a[0][0]=1;
    for(int i=1;i<=m;++i){
        for(int j=0;j1][(j-1+n)%n]+a[i-1][(j+1)%n];
        }
    }
}

int main()
{
    freopen("ball.in","r",stdin);
    freopen("ball.out","w",stdout);
    cin>>n>>m;
    prepare();
    cout<0]<return 0;
}

至于最后一题嘛,有点恶心,不是一时半会说得明白的,这道题我会独立形成一篇博客的,嗝嗝嗝。。。

你可能感兴趣的:(C++,Junior,NOIP)