A题:状态压缩dp??枚举 两行???反正四个小时的比赛,没怎么敢写。。。毕竟好久没有写那个方面的题目了!!也未必能写出来。。
C题:数列。。。等差,等比,大数幂取模,就这些知识点而已
#include<iostream>
#include<cstdlib>
#include<stdio.h>
#define ll long long
using namespace std;
ll powermod(ll a,ll b,ll p)
{
ll res=1;
while(b)
{
if(b&1)res=res*a%p;
b>>=1;
a=a*a%p;
}
return res;
}
int main()
{
int mod=100007,a,b,c,n;
while(scanf("%d%d%d%d",&a,&b,&c,&n)!=EOF)
{
if((a+c)==2*b)
{
printf("%lld\n",(a%mod+((long long)(n-1)%mod)*((b-a)%mod))%mod);
}
else
{
int q=b/a;
int m=n-1;
int p=100007;
//(a^b) % p = ((a % p)^b) % p
//(q^m) % p = ((q % p)^m) % p
//int ans=int((pow((q%p),m)))%p;
printf("%lld\n",powermod(q,m,p)%mod);
}
}
return 0;
}
/*
1 2 3 5
1 2 4 4
*/
E题:LIS变形,卡了两次!!!
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 20005
int a[N],dp1[N];
int n;
void LIS(int dp[],int a[])
{
int stack[N];
int top=0;
stack[top]=-999999;
for(int i=1; i<=n; i++)
{
//如果a[i]>栈顶部元素,则压栈
if(a[i]<0)
{
dp[i]=dp[i-1];
continue;
}
if(a[i]>=stack[top])
{
stack[++top]=a[i];
dp[i]=top;
}
//如果a[i]不大于栈顶部元素,则二分查找第一个比a[i]大的元素
else
{
int l=1,r=top;
while(l<=r)
{
int mid=(l+r)>>1;
if(a[i]>stack[mid])
{
l=mid+1;
}
else
r=mid-1;
}
//替换a[i]
stack[l]=a[i];
dp[i]=l;
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
a[i]-=i;
dp1[i]=0;
}
LIS(dp1,a);
int maxx=-1;
for(int i=1; i<=n; i++)
{
if(dp1[i]>maxx)
maxx=dp1[i];
}
printf("%d\n",maxx);
}
return 0;
}
/*
5
13 14 1 15 16
5
13 14 1 16 17
5
13 14 12 15 16
*/
F题:我用的vector 直接遍历判断,貌似有的队直接邪恶打表过的T_T,能过就是一种能力。。。
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<vector>
using namespace std;
int n;
bool IsPrime3(int n)
{
if ( n < 2 )
{
// 小于2的数即不是合数也不是素数
return 0;
}
int len=sqrt(n);
for(int i=2;i<=len;i++)
{
if(n%i==0)return 0;
}
return 1;
}
int main()
{
vector<int>p[10];
p[1].push_back(2);
p[1].push_back(3);
p[1].push_back(5);
p[1].push_back(7);
int i,j,k,len;
for(i=2;i<=8;i++)
{
len=p[i-1].size();
for(j=0;j<len;j++)
{
int v=p[i-1][j];
for(k=1;k<=9;k+=2)
{
int tmp=v*10+k;
if(IsPrime3(tmp))
{
p[i].push_back(tmp);
}
}
}
}
while(scanf("%d",&n)!=EOF)
{
len=p[n].size();
for(i=0;i<len;i++)
{
cout<<p[n][i]<<endl;
}
}
return 0;
}
G题:dfs 看代码 就能明白 ,队友这代码精简能力了。。。。囧~~~~
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
bool visit[25][25][25];
int A,B,C;
bool have[25];
int ans[25],idx;
void dfs(int a,int b,int c)
{
if(a==0)
{
if(!have[c])
{
have[c]=true;
ans[idx++]=c;
}
}
if(a>B-b)
{
if(!visit[a-B+b][B][c])
{
visit[a-B+b][B][c]=true;
dfs(a-B+b,B,c);
visit[a-B+b][B][c]=false;
}
}
else
{
if(!visit[0][b+a][c])
{
visit[0][b+a][c]=true;
dfs(0,b+a,c);
visit[0][b+a][c]=false;
}
}
if(a>C-c)
{
if(!visit[a-C+c][b][C])
{
visit[a-C+c][b][C]=true;
dfs(a-C+c,b,C);
visit[a-C+c][b][C]=false;
}
}
else
{
if(!visit[0][b][c+a])
{
visit[0][b][c+a]=true;
dfs(0,b,c+a);
visit[0][b][c+a]=false;
}
}
if(b>A-a)
{
if(!visit[A][b-A+a][c])
{
visit[A][b-A+a][c]=true;
dfs(A,b-A+a,c);
visit[A][b-A+a][c]=false;
}
}
else
{
if(!visit[a+b][0][c])
{
visit[a+b][0][c]=true;
dfs(a+b,0,c);
visit[a+b][0][c]=false;
}
}
if(b>C-c)
{
if(!visit[a][b-C+c][C])
{
visit[a][b-C+c][C]=true;
dfs(a,b-C+c,C);
visit[a][b-C+c][C]=false;
}
}
else
{
if(!visit[a][0][c+b])
{
visit[a][0][c+b]=true;
dfs(a,0,c+b);
visit[a][0][c+b]=false;
}
}
if(c>A-a)
{
if(!visit[A][b][c-A+a])
{
visit[A][b][c-A+a]=true;
dfs(A,b,c-A+a);
visit[A][b][c-A+a]=false;
}
}
else
{
if(!visit[a+c][b][0])
{
visit[a+c][b][0]=true;
dfs(a+c,b,0);
visit[a+c][b][0]=false;
}
}
if(c>B-b)
{
if(!visit[a][B][c-B+b])
{
visit[a][B][c-B+b]=true;
dfs(a,B,c-B+b);
visit[a][B][c-B+b]=false;
}
}
else
{
if(!visit[a][b+c][0])
{
visit[a][b+c][0]=true;
dfs(a,b+c,0);
visit[a][b+c][0]=false;
}
}
}
int main()
{
while(scanf("%d%d%d",&A,&B,&C)!=EOF)
{
idx=0;
for(int i=0; i<=20; i++)
{
for(int j=0; j<=20; j++)
{
for(int k=0; k<=20; k++)
{
visit[i][j][k]=false;
}
}
have[i]=false;
}
visit[0][0][C]=true;
dfs(0,0,C);
sort(ans,ans+idx);
for(int i=0;i<idx;i++)
{
if(i==0)
printf("%d",ans[i]);
else printf(" %d",ans[i]);
}
printf("\n");
}
return 0;
}
H题:bfs 我终于知道bfs 还能那么长~~~~~~~~不知道队友什么心态?!!!
#include<iostream>
#include<stdio.h>
#include<stack>
#include<string.h>
#include<math.h>
using namespace std;
bool visit[5][5][5][5][5][5][5][5][5];
struct node
{
int a[3][3];
int type;
int step;
int parent;
} cur,nod,tmpb,q[1000000];
int b[3][3],tmpa[3][3];
int ans;
void A()
{
if((b[0][0]+3)%12==0)
b[0][0]=12;
else
b[0][0]=(b[0][0]+3)%12;
}
void B()
{
if((b[0][1]+3)%12==0)
b[0][1]=12;
else
b[0][1]=(b[0][1]+3)%12;
}
void C()
{
if((b[0][2]+3)%12==0)
b[0][2]=12;
else
b[0][2]=(b[0][2]+3)%12;
}
void D()
{
if((b[1][0]+3)%12==0)
b[1][0]=12;
else
b[1][0]=(b[1][0]+3)%12;
}
void E()
{
if((b[1][1]+3)%12==0)
b[1][1]=12;
else
b[1][1]=(b[1][1]+3)%12;
}
void F()
{
if((b[1][2]+3)%12==0)
b[1][2]=12;
else
b[1][2]=(b[1][2]+3)%12;
}
void G()
{
if((b[2][0]+3)%12==0)
b[2][0]=12;
else
b[2][0]=(b[2][0]+3)%12;
}
void H()
{
if((b[2][1]+3)%12==0)
b[2][1]=12;
else
b[2][1]=(b[2][1]+3)%12;
}
void I()
{
if((b[2][2]+3)%12==0)
b[2][2]=12;
else
b[2][2]=(b[2][2]+3)%12;
}
void f1()
{
A();
B();
D();
E();
}
void f2()
{
A();
B();
C();
}
void f3()
{
B();
C();
E();
F();
}
void f4()
{
A();
D();
G();
}
void f5()
{
B();
D();
E();
F();
H();
}
void f6()
{
C();
F();
I();
}
void f7()
{
D();
E();
G();
H();
}
void f8()
{
G();
H();
I();
}
void f9()
{
E();
F();
H();
I();
}
bool is(node t)
{
int i,j;
for(i=0; i<3; i++)
{
for(j=0; j<3; j++)
{
if(t.a[i][j]!=12)
return false;
}
}
return true;
}
bool vis(int aa[3][3])
{
return visit[aa[0][0]/3][aa[0][1]/3][aa[0][2]/3][aa[1][0]/3][aa[1][1]/3][aa[1][2]/3][aa[2][0]/3][aa[2][1]/3][aa[2][2]/3];
}
void bfs()
{
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
nod.a[i][j]=tmpa[i][j];
}
}
nod.step=0;
nod.parent=-1;
int front=0,rear=0;
//visit[]=true;
//q.push(nod);
q[rear++]=nod;
while(front<rear)
{
//cout<<":dsfs"<<endl;
cur=q[front++];
if(is(cur))
{//cout<<"sdfs"<<endl;
//printf("%d\n",cur.step);
ans=front-1;
return;
}
/
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
b[k][p]=cur.a[k][p];
}
f1();//cout<<"dsf"<<endl;
if(!vis(b))
{
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
tmpb.a[k][p]=b[k][p];
}
tmpb.type=1;
tmpb.parent=front-1;
tmpb.step=cur.step+1;
//visit[tmpb]=true;
visit[b[0][0]/3][b[0][1]/3][b[0][2]/3][b[1][0]/3][b[1][1]/3][b[1][2]/3][b[2][0]/3][b[2][1]/3][b[2][2]/3]=true;
q[rear++]=tmpb;
}
//
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
b[k][p]=cur.a[k][p];
}
f2();
if(!vis(b))
{
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
tmpb.a[k][p]=b[k][p];
}
tmpb.type=2;
tmpb.parent=front-1;
tmpb.step=cur.step+1;
visit[b[0][0]/3][b[0][1]/3][b[0][2]/3][b[1][0]/3][b[1][1]/3][b[1][2]/3][b[2][0]/3][b[2][1]/3][b[2][2]/3]=true;
q[rear++]=tmpb;
}
/
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
b[k][p]=cur.a[k][p];
}
f3();
if(!vis(b))
{
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
tmpb.a[k][p]=b[k][p];
}
tmpb.type=3;
tmpb.parent=front-1;
tmpb.step=cur.step+1;
visit[b[0][0]/3][b[0][1]/3][b[0][2]/3][b[1][0]/3][b[1][1]/3][b[1][2]/3][b[2][0]/3][b[2][1]/3][b[2][2]/3]=true;
q[rear++]=tmpb;
}
/
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
b[k][p]=cur.a[k][p];
}
f4();
if(!vis(b))
{
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
tmpb.a[k][p]=b[k][p];
}
tmpb.type=4;
tmpb.parent=front-1;
tmpb.step=cur.step+1;
visit[b[0][0]/3][b[0][1]/3][b[0][2]/3][b[1][0]/3][b[1][1]/3][b[1][2]/3][b[2][0]/3][b[2][1]/3][b[2][2]/3]=true;
q[rear++]=tmpb;
}
///
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
b[k][p]=cur.a[k][p];
}
f5();
if(!vis(b))
{
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
tmpb.a[k][p]=b[k][p];
}
tmpb.type=5;
tmpb.parent=front-1;
tmpb.step=cur.step+1;
visit[b[0][0]/3][b[0][1]/3][b[0][2]/3][b[1][0]/3][b[1][1]/3][b[1][2]/3][b[2][0]/3][b[2][1]/3][b[2][2]/3]=true;
q[rear++]=tmpb;
}
/
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
b[k][p]=cur.a[k][p];
}
f6();
if(!vis(b))
{
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
tmpb.a[k][p]=b[k][p];
}
tmpb.type=6;
tmpb.parent=front-1;
tmpb.step=cur.step+1;
visit[b[0][0]/3][b[0][1]/3][b[0][2]/3][b[1][0]/3][b[1][1]/3][b[1][2]/3][b[2][0]/3][b[2][1]/3][b[2][2]/3]=true;
q[rear++]=tmpb;
}
/
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
b[k][p]=cur.a[k][p];
}
f7();
if(!vis(b))
{
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
tmpb.a[k][p]=b[k][p];
}
tmpb.type=7;
tmpb.parent=front-1;
tmpb.step=cur.step+1;
visit[b[0][0]/3][b[0][1]/3][b[0][2]/3][b[1][0]/3][b[1][1]/3][b[1][2]/3][b[2][0]/3][b[2][1]/3][b[2][2]/3]=true;
q[rear++]=tmpb;
}
//
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
b[k][p]=cur.a[k][p];
}
f8();
if(!vis(b))
{
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
tmpb.a[k][p]=b[k][p];
}
tmpb.type=8;
tmpb.parent=front-1;
tmpb.step=cur.step+1;
visit[b[0][0]/3][b[0][1]/3][b[0][2]/3][b[1][0]/3][b[1][1]/3][b[1][2]/3][b[2][0]/3][b[2][1]/3][b[2][2]/3]=true;
q[rear++]=tmpb;
}
///
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
b[k][p]=cur.a[k][p];
}
f9();
if(!vis(b))
{
for(int k=0; k<3; k++)
{
for(int p=0; p<3; p++)
tmpb.a[k][p]=b[k][p];
}
tmpb.type=9;
tmpb.parent=front-1;
tmpb.step=cur.step+1;
visit[b[0][0]/3][b[0][1]/3][b[0][2]/3][b[1][0]/3][b[1][1]/3][b[1][2]/3][b[2][0]/3][b[2][1]/3][b[2][2]/3]=true;
q[rear++]=tmpb;
}
//
}
}
int main()
{
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
{
scanf("%d",&tmpa[i][j]);
}
memset(visit,false,sizeof(visit));
visit[tmpa[0][0]/3][tmpa[0][1]/3][tmpa[0][2]/3][tmpa[1][0]/3][tmpa[1][1]/3][tmpa[1][2]/3][tmpa[2][0]/3][tmpa[2][1]/3][tmpa[2][2]/3]=true;
bfs();
int s[100000];
int idx=0;
for(int i=ans;;)
{
if(q[i].parent==-1)
break;
//s.push(q[i].type);
s[idx++]=q[i].type;
i=q[i].parent;
}
cout<<s[idx-1];
for(int i=idx-2;i>=0;i--)
{
cout<<" "<<s[i];
}
cout<<endl;
return 0;
}
/*
9 9 12
6 6 6
6 3 6
*/