目录
•$Luogu P1006$ 传纸条$( √ )$
•$Luogu P1125$ 笨小猴$( √ )$
•$Luogu P1149$ 火柴棒等式$( √ )$
•$Luogu P1155$ 双栈排序$( √ )$
$Luogu P1006$ 传纸条
相当于从左上角找两条不相交的路径到右下角,设$f[x][i][j]$为走了$x$步,左边的路径在第$i$行,右边的路径在第$j$行时的最大答案。
同一时刻两条路径到达的点一定在一条从左下指向右上的对角线上,所以我们可以直接根据行求出列,注意一下实现时的细节
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=52; 4 int f[N*2][N][N]; 5 int n,m,a[N][N]; 6 int Max(int a,int b,int c,int d){ 7 int maxn=a; 8 if(b>maxn) maxn=b; 9 if(c>maxn) maxn=c; 10 if(d>maxn) maxn=d; 11 return maxn; 12 } 13 int main(){ 14 scanf("%d%d",&m,&n); 15 for(int i=1;i<=m;i++) 16 for(int j=1;j<=n;j++) 17 scanf("%d",&a[i][j]); 18 f[0][1][1]=0; 19 for(int k=1;k<m+n;k++) 20 for(int i=1;i<m;i++) 21 for(int j=i+1;j<=m;j++){ 22 if(k-i+1<1||k-j+1<1) continue; 23 f[k][i][j]=Max(f[k-1][i][j],f[k-1][i-1][j-1],f[k-1][i][j-1],f[k-1][i-1][j])+a[i][k-i+1]+a[j][k-j+1]; 24 //if(i==j) f[k][i][j]-=a[i][k-i+1]; 25 } 26 printf("%d",f[n+m-1][m-1][m]); 27 return 0; 28 }
$Luogu P1125$ 笨小猴
计算每个字符出现的次数,然后求出最大值和最小值,判断两者之差是否为质数用试除法即可
1 #include<bits/stdc++.h> 2 using namespace std; 3 int num[30],maxn=0,minn=100; 4 char ch; 5 bool zhishu(int x){ 6 if(x<=1) return 0; 7 for(int i=2;i*i<=x;i++) 8 if(x%i==0) return 0; 9 return 1; 10 } 11 int main(){ 12 ch=getchar(); 13 while(ch!=' '){ 14 num[ch-96]++; 15 ch=getchar(); 16 } 17 for(int i=1;i<=26;i++){ 18 if(!num[i]) continue; 19 if(num[i]>maxn) maxn=num[i]; 20 if(num[i]<minn) minn=num[i]; 21 } 22 int ans=maxn-minn; 23 if(zhishu(ans)) printf("Lucky Word %d",ans); 24 else printf("No Answer 0"); 25 return 0; 26 }
$Luogu P1149$ 火柴棒等式
枚举火柴可能拼出的数,然后判断需要的火柴数是否恰好是题目给出的火柴数$($记得减去加号和等号所需的火柴$)$
1 // luogu-judger-enable-o2 2 #include<bits/stdc++.h> 3 using namespace std; 4 int n,ans=0,num[10]={6,2,5,5,4,5,6,3,7,6}; 5 int sum(int x){ 6 if(x<10) 7 return num[x]; 8 int e,s=0; 9 while(x!=0){ 10 e=x%10; 11 s+=num[e]; 12 x/=10; 13 } 14 return s; 15 } 16 int main(){ 17 scanf("%d",&n); 18 n=n-4; 19 for(int i=0;i<=900;++i) 20 for(int j=0;j<=900;++j) 21 { 22 int k=i+j; 23 if(sum(i)+sum(j)+sum(k)==n) ans++; 24 } 25 printf("%d ",ans); 26 }
$Luogu P1155$ 双栈排序
因为$hl$在$10.27$那天考到了这题,所以我直接贴个$link o$戳这里
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define ri register int 4 #define rl register ll 5 #define go(i,a,b) for(ri i=a;i<=b;i++) 6 #define back(i,a,b) for(ri i=a;i>=b;i--) 7 #define G getchar() 8 #define il inline 9 #define pf printf 10 #define pb push_back 11 using namespace std; 12 il ll fr(){ 13 rl w=0,q=1; 14 char ch=G; 15 while(ch<'0'||ch>'9'){if(ch=='-')q=-1;ch=G;} 16 while(ch>='0'&&ch<='9')w=(w<<1)+(w<<3)+ch-'0',ch=G; 17 return w*q; 18 } 19 const int N=1002; 20 int n,a[N],c[N],mn[N],S1[N],s1,S2[N],s2,pos=1; 21 vector<int> q[N]; 22 il bool POP(ri col){ 23 if(col==1)if(s1&&S1[s1]==pos){ 24 putchar('d');putchar(' '); 25 s1--;pos++;return 1; 26 } 27 if(col==0)if(s2&&S2[s2]==pos){ 28 putchar('b');putchar(' '); 29 s2--;pos++;return 1; 30 } 31 return 0; 32 } 33 il void PUSH(ri sum,ri col){ 34 if(col==1){ 35 while(POP(0)); 36 while(s1&&S1[s1]<sum)if(!POP(1))POP(0); 37 while(POP(0)); 38 S1[++s1]=sum;putchar('c');putchar(' '); 39 } 40 else{ 41 while(s2&&S2[s2]<sum)if(!POP(0))POP(1); 42 S2[++s2]=sum;putchar('a');putchar(' '); 43 } 44 } 45 int main(){ 46 //freopen("twostack.in","r",stdin); 47 //freopen("twostack.out","w",stdout); 48 n=fr(); 49 go(i,1,n)a[i]=fr(); 50 mn[n+1]=n+1; 51 back(i,n,1)mn[i]=min(mn[i+1],a[i]); 52 go(i,1,n)go(j,i+1,n) 53 if(mn[j+1]<a[i]&&a[i]<a[j]) 54 q[i].pb(j),q[j].pb(i),c[i]=c[j]=-1; 55 go(i,1,n) 56 if(!(~c[i])){ 57 queue<int>Q;Q.push(i);c[i]=0; 58 while(!Q.empty()){ 59 ri p=Q.front();Q.pop(); 60 go(j,0,(int)q[p].size()-1){ 61 if((~c[q[p][j]])&&c[q[p][j]]!=(c[p]^1)){puts("0");return 0;} 62 if(!(~c[q[p][j]]))Q.push(q[p][j]); 63 c[q[p][j]]=c[p]^1; 64 } 65 } 66 } 67 go(i,1,n)PUSH(a[i],c[i]); 68 bool tag=1; 69 while(tag){ 70 tag=0; 71 while(POP(0))tag=1; 72 while(POP(1))tag=1; 73 } 74 return 0; 75 }