杭电上的这场比赛终于结束了。。。没进前500 很佩服排在前面的大虾
只提交了第二题 括号匹配 还是互联网上的 用动态规划。。。只是听说过 还没具体学习
第四题到最后也没弄出正确答案 这道题我觉得算是四道题里面最简单的了 可是还没AC
希望大家帮我看看哪里错了 谢谢
第四题:
旋转的二进制
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1126 Accepted Submission(s): 214
Problem Description
给定一个自然数M,及其二进制长度N,得到一个N位的二进制串 b1 b2 ... bN-1 bN 将该串做左旋转,即b1移到bN后面,得到一个新的二进制串: b2 b3 ... bN-1 bN b1 对新的二进制串再做左旋转,得二进制串 b3 b4 ... bN-1 bN b1 b2 重复旋转操作操作,可得N个二进制串,对这N个串排序,可得一个N*N的矩阵. 例如: 1 0 0 0 1->0 0 0 1 1->0 0 1 1 0->0 1 1 0 0->1 1 0 0 0 对它们做排序,得矩阵0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0
问:给出一个自然数M,及其二进制长度N,求出排序矩阵的最后一列。
对于上面的例子,给出M=3,N=5,要你的程序输出10010。
补充说明:存在自然数M的二进制表达超过N位的情况,在这种情况下,取前N次循环的二进制串排序后的最后一列即可。
Input
第一行有一个自然数K,代表有K行测试数据(K<=1000)。 第二行至第K+1行,每行的第一个为自然数M,第二个为二进制长度N(N<64)。
Output
输出K行,每行N个二进制,表示矩阵最后一列从上到下的二进制。
Sample Input
3 3 5 4 7 1099512709120 45
Sample Output
10010 1000000 110000000000000000000000000000100000000000000
#include<stdio.h>
#include<string.h>
int main()
{
int w,q,p,n,i,j,k,a[100],b[100][100],t[100];
long long int m;
scanf("%d",&k);
while(k--)
{
a[100]= {0};
//t[100]= {0};
//b[100][100]={0};
scanf("%lld %d",&m,&n);
i=n;
while(m||!i)
{
a[i]=m%2;
m=m/2;
i--;
}
for(i=1; i<=n; i++)
{
for(q=1; q<=n; q++)
{
b[i][q]=a[q];
}
for(j=1; j<=n; j++)
{
a[j-1]=a[j];
}
a[n]=a[0];
a[0]=0;
}
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
printf("%d",b[i][j]);
}
printf("\n");
}
for(i=1; i<=n; i++)
for(j=i+1; j<=n; j++)
{
for(p=1; p<=n; p++)
{
if(b[j][p]<b[i][p])
{
for(q=1; q<=n; q++)
t[q]=b[j][q];
for(q=1; q<=n; q++)
b[j][q]=b[i][q];
for(q=1; q<=n; q++)
b[i][q]=t[q];
goto endd;
}
}
endd: ;
}
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
printf("%d",b[i][j]);
}
printf("\n");
}
for(i=1; i<=n; i++)
{
printf("%d",b[i][n]);
}
printf("\n");
}
return 0;
}