乒乓球:
#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");
}
}