T55244 电影院
T1爆零系列
这道题是一道纯模拟,用心写一写一定能些出来。
但是T1爆零怎么办啊???
检查这些东西:
-
开数组的范围。最大差不多就开一千万的一维数组,最小也一定要比最大数据范围大至少5以上!!千万不要看错数据范围!(我就崩在这里了)
-
看清所有的题目条件,特别是所有特意加粗的那些字体!最好在代码旁边打上注释,注意静态差错!
-
在重要的地方debug一下。保险起见还可以特意去单步调试!
-
只有纯粹模拟的题目可以试着写两份代码,用类似于对拍的方式看看哪里是对的那里是错的。
差不多就是这些,剩下的就是运气了。。。
代码:
#include<cstdio>
const int maxn = 105;
char a[maxn][maxn];
int left[maxn];
int n, m, q;
int find(int r, int k)
{
for(int i = 1; i <= m - k + 1; i++)
{
if(a[r][i] != '-') continue;
bool flag = true;
// [i, i + k - 1]
// i + k - 1 = n
for(int j = i + 1; j <= i + k - 1; j++)
{
if(a[r][j] != a[r][i])
{
flag = false;
break;
}
}
if(flag) return i;
}
return -1;
}
void sell(int x, int y)
{
a[x][y] = '#';
left[x]--, left[0]--;
printf("%d%c", x, y + 'A' - 1);
}
void solve(int r, int k)
{
if(r > n)
{
printf("Theater only contains %d rows\n", n);
return;
}
if(left[0] < k)
{
printf("Sold out\n");
return;
}
if(left[r] >= k)
{
int temp = find(r, k);
if(temp != -1)
{
for(int i = temp; i < temp + k; i++)
{
sell(r, i);
if(i != temp + k - 1) printf(" ");
}
printf("\n");
}
else
{
for(int i = 1, cnt = 0; i <= m && cnt < k; i++)
{
if(a[r][i] == '-')
{
sell(r, i);
cnt++;
if(cnt != k) printf(" ");
}
}
printf("\n");
}
}
else
{
bool success = false;
for(int i = 1; i <= n; i++)
{
int temp = find(i, k);
if(temp != -1)
{
for(int j = temp; j < temp + k; j++)
{
sell(i, j);
if(j != temp + k - 1) printf(" ");
}
printf("\n");
success = true;
break;
}
}
if(!success)
{
printf("Please contact our staff to buy tickets\n");
return;
}
}
}
void debug()
{
for(int i = 1; i <= n; i++) printf("%s\n", a[i] + 1);
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
{
scanf("%s", a[i] + 1);
for(int j = 1; j <= m; j++)
{
if(a[i][j] == '-') left[i]++, left[0]++;
}
}
scanf("%d", &q);
while(q--)
{
int r, k; scanf("%d%d", &r, &k);
solve(r, k);
//debug();
}
return 0;
}