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

乒乓球:

#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");  
    }  
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值