acmore|acmore.cc1087乒乓球1088数字游戏1089栈1090麦森数(NOIP2003)

时间:2022-12-16 19:34:19

乒乓球:

#include<cstdio>  
#include<cstring>

const int maxn=1e6;
int n=0;
char s[maxn];

bool ok(int x,int y,int k)
{
if(x-y>=2 && x>=k)return 1;
if(y-x>=2 && y>=k)return 1;
return 0;
}

void write(int k)
{
int i,x=0,y=0;
for(i=0;i<n;i++)
{
if(s[i]=='W')x++;
else y++;

if(ok(x,y,k))
{
printf("%d:%d\n",x,y);
x=y=0;
}
}
printf("%d:%d\n",x,y);
}

int main()
{
while(scanf("%c",&s[n]),s[n]!='E')
if(s[n]=='W' || s[n]=='L')n++;
write(11),printf("\n"),write(21);
return 0;
}

数字游戏:

#include <stdio.h>  
#include <string.h>  
#define MAX 10000000  
#define MIN -10000000  
int line[200],n,m,Min,Max,sum[200];  
int f[200][20];//f[i][j]=第1-i个数分成j份,结果最大值  
int g[200][20];//g[i][j]=第1-i个数分成j份,结果最小值  
int min(int a,int b)  
{  
    if(a>b)  
        return b;  
    return a;  
}  
int max(int a,int b)  
{  
    if(a>b)  
        return a;  
    return b;  
}  
void dp(int a[])  
{  
    int i,j,k;  
    for(i=1;i<=n;i++)  
        sum[i]=sum[i-1]+a[i];  
    for(i=0;i<=n;i++)  
        for(j=0;j<=m;j++)  
        {  
            f[i][j]=0;  
            g[i][j]=-1u>>1;  
        }  
    for(i=1;i<=n;i++)  
    {  
        f[i][1]=g[i][1]=(sum[i]%10+10)%10;  
    }  
    f[0][0]=1;  
    g[0][0]=1;  
    for(j=2;j<=m;j++)  
    {  
        for(i=j;i<=n;i++)  
        {  
            for(k=j-1;k<i;k++)  
            {  
                {  
                    f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));  
                    g[i][j]=min(g[i][j],g[k][j-1]*(((sum[i]-sum[k])%10+10)%10));  
                }  
            }  
        }  
    }  
    Max=max(Max,f[n][m]);  
    Min=min(Min,g[n][m]);  
}  
int main()  
{  
    int i,j,k;  
    Max=0;  
    Min=-1u>>1;  
    scanf("%d%d",&n,&m);  
    for(i=1;i<=n;i++)  
    {  
        scanf("%d",&line[i]);  
        line[i+n]=line[i];  
    }  
    for(i=0;i<n;i++)  
        dp(line+i);  
    printf("%d\n%d\n",Min,Max);  
    return 0;  

}  

栈:

#include<cstdio>  
#define maxn 20  
using namespace std;  
int n,f[maxn];  
  
int main()  
{  
  int i,j,k;  
  scanf("%d",&n);  
    
  f[0]=f[1]=1;  
  for(i=2;i<=n;i++)  
    for(j=0;j<i;j++)  
      f[i]+=f[j]*f[i-j-1];  
  printf("%d\n",f[n]);      
  return 0;  
}  

麦森数:

#include<cstdio>  
#include<iostream>  
#include<algorithm>  
#include<cmath>  
#include<cstring>  
#define LL long long  
using namespace std;  
//#define BIG 100000LL  
const LL BIG=100000LL;   
struct INT{  
    LL data[500];  
    int len;  
    INT(){memset(data,0,sizeof(data));len=0;}  
    void operator=(int x){  
        while(x){  
            data[len++]=x%BIG;  
            x/=BIG;  
        }  
    }  
}ans,tmp;  
int p;  
INT operator*(const INT &a,const INT &b){  
    INT ret;   
    int i, j, add;   
    for(i=0;i<a.len&&i<100;i++){  
        add=0;  
        for(j=0;j<b.len&&j<100;j++)  
            if(i+j<100){  
                ret.data[i+j]+=a.data[i]*b.data[j]+add;  
                if((add=ret.data[i+j]/BIG))  
                    ret.data[i+j]%=BIG;  
            }  
        if(i+j<100)  
            ret.data[i+j]+=add;  
    }  
    int len=i+j-1;  
    if(add&&len<100)  
        ret.data[len++]=add;  
    ret.len=len;  
    return ret;  
}  
void work(){  
    int t=p;  
    ans=1;tmp=2;  
    while(t){  
        if(t&1)ans=ans*tmp;  
        t>>=1;  
        tmp=tmp*tmp;  
    }  
}  
int main(){  
    int i;  
    scanf("%d",&p);  
    printf("%d\n",int(log10(2)*p)+1);  
    work();  
    ans.data[0]--;  
    for(i=99;i>=0;i--){  
        printf("%05lld",ans.data[i]);  
        if(i%10==0)  
            printf("\n");  
    }  
}