首页 > 编程语言 > 详细

Openjudge 1.6 一位数组

时间:2019-12-05 20:16:50      阅读:80      评论:0      收藏:0      [点我收藏+]

1.6.7 有趣的跳跃

有关于数组的排序(sort)

#include <cstdio>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    int n;
    scanf("%d",&n);
    if(n==1){
        printf("Jolly");
        return 0;
    }
    int a[n+5];
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    int sub[n+5];
    for(int i=1;i<n;i++){
        sub[i]=abs(a[i+1]-a[i]); 
        //printf("%d \n",sub[i]);
    }
    sort(sub+1,sub+n);
    //for(int i=1;i<n;i++){
    //  printf("%d \n",sub[i]);
    //}
    sub[0]=0;
    int j=0;
    bool q=1;
    while(sub[j+1]-sub[j]==1){
        if(j+1==n-1) {
            q=0;
            break;
        }
        j++;
    }
    if(q==0) printf("Jolly");
    else printf("Not jolly");
    return 0;
}

注意:

1.检查的时候多输出的部分提交的时候要注释掉(要不然自己都不知道错在哪)

2.核心部分循环的起点和终点找不准的时候要多试,如:

sub[0]=0;//一开始没加,会导致有的数据对而有的不对
    int j=0;//避免两个数的时候错误特判
    bool q=1;
    while(sub[j+1]-sub[j]==1){
        if(j+1==n-1) {
            q=0;
            break;
        }
        j++;
    }

1.6.8 石头剪刀布

先对一个序列进行填充,使用语句:

for(int i=0;i<N;i++){
        if(i>=NA) k1[i]=k1[i%NA]; 
    }
    for(int i=0;i<N;i++){
        if(i>=NB) k2[i]=k2[i%NB];
    }

填充之后诸位比较就可以了


#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int main(){
    int N=0,NA=0,NB=0;
    scanf("%d%d%d",&N,&NA,&NB);
    int k1[N+1],k2[N+1];
    int m=0,n=0;
    for(int i=0;i<NA;i++){
        scanf("%d",&k1[i]);
    }
    for(int i=0;i<NB;i++){
        scanf("%d",&k2[i]);
    }
    for(int i=0;i<N;i++){
        if(i>=NA) k1[i]=k1[i%NA]; 
    }
    for(int i=0;i<N;i++){
        if(i>=NB) k2[i]=k2[i%NB];
    }
    //for(int i=0;i<N;i++){
    //  printf("%d %d \n",k1[i],k2[i]); 
    //} 
    for(int i=0;i<N;i++){
        if((k1[i]==5&&k2[i]==0)||(k1[i]==2&&k2[i]==5)||(k1[i]==0&&k2[i]==2)) m++;
        if((k2[i]==5&&k1[i]==0)||(k2[i]==2&&k1[i]==5)||(k2[i]==0&&k1[i]==2)) n++;
    }
    //printf("\n%d %d\n",m,n);
    if(m==n) printf("draw");
    else if(m>n) printf("A");
    else printf("B");
    return 0;
}

1.6.10 高精度加法(复习)

可能有多余的前导0

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
char ansa[205],ansb[205];
int ansaa[205],ansbb[205];
int numans[210];
int ans,k,t,lenm,len1,len2;
int main( ){
    scanf("%s",ansa+1);
    scanf("%s",ansb+1);
    len1=strlen(ansa+1);
    len2=strlen(ansb+1);
    for(int i=1,j=len1;i<=len1;i++,j--) ansaa[i]=ansa[j]-'0';
    for(int i=1,j=len2;i<=len2;i++,j--) ansbb[i]=ansb[j]-'0';
    lenm=max(len1,len2);
    for(int i=1;i<=lenm;i++){
        numans[i]+=ansaa[i]+ansbb[i];
        if(numans[i]>=10){
            numans[i+1]++;
            numans[i]%=10;
        }
    }
    lenm++;
    while(numans[lenm]==0){
        lenm--;
        if(lenm==-1){
            cout<<"0";
        }
    }
    for(int i=lenm;i>=1;i--){
        printf("%d",numans[i]);
    }
    return 0;
} 

1.6.15 阶乘和

用高精度输出\(S=1!+2!+...+n!(n \leq 50)\),其中\(n!=n \times(n-1)\times...\times2\times1\)

#include<bits/stdc++.h>
using namespace std;
int a[10001]={1};
int ans[100001]={0};
char n[1001];
int en[1001];
int lans=1;
int la=1;
int x;
int main()
{
    int n;
    cin>>n;
    int x=0;
    for(int i=1;i<=n;i++)
    {
        memset(a,0,sizeof(a));
        a[0]=1;
        for(int k=1;k<=i;k++)
        {
            for(int j=0;j<la;j++)
            {
                a[j]=a[j]*k+x;
                x=a[j]/10;
                if(x>0&&j==la-1)
                    la++;
                a[j]=a[j]%10;
            }
        }
        int l=0;
        x=0;
        while(l<=la||l<=lans) {
            ans[l]=ans[l]+a[l]+x;
            x=ans[l]/10;
            if(x>0)lans++;
            ans[l]=ans[l]%10;
            l++;
        }
    }
    int flag=0;
    for(int i=lans;i>=0;i--){
        if(ans[i]==0&&flag==0) continue;
        else flag=1;
        cout<<ans[i];
    }
    return 0;
}

对于阶乘的问题:

全排列 P1706搜索P1706

给定正整数\(n(n\geq 1)\),输出\(1\)\(n\)的全部排列方式

一共有\(n!\)

注:加注释部分是八皇后的写法,ans是答案,但是没有高精度,也可以表示阶乘

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int a[25];
bool vis[25];
int n;
int ans=0; 
void f(int x){
    if(x==n+1){
        ans++;
        //if(ans<=3){
            for(int i=1;i<=n;i++){
                printf("%5d",a[i]);
            }
            printf("\n");
        //}
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(vis[i]==1) continue;
        bool q=1;
        //for(int j=1;j<x;j++)
        //{
        //  if(abs(x-j)==abs(i-a[j])){
        //      q=0;
        //      break;
        //  }
        //  
        //}
        if(q){
            vis[i]=1;
            a[x]=i;
            f(x+1);
            vis[i]=0;
        }

    }
    return ;
}
int main( ){
    scanf("%d",&n);
    f(1);
    printf("%d",ans); //...
    return 0;
} 

Openjudge 1.6 一位数组

原文:https://www.cnblogs.com/liuziwen0224/p/11991550.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!