A. Kalevitch and Chess
虽然想到了每次要涂完一整行才能计数,结果还是被算计了,有一种情况是全黑的。
#include<bits/stdc++.h>
using namespace std;
char g[10][10];
int paintR(int i){
for(int j=0;j<8;j++){
if(g[i][j]=='W')
return 0;
}
for(int j=0;j<8;j++){
g[i][j]='R';
}
return 1;
}
int paintC(int j){
for(int i=0;i<8;i++){
if(g[i][j]=='W')
return 0;
}
for(int i=0;i<8;i++){
g[i][j]='R';
}
return 1;
}
int main(){
for(int i=0;i<8;i++){
scanf("%s",g[i]);
}
int cnt=0;
for(int i=0;i<8;i++){
if(g[i][0]!='W'){
cnt+=paintR(i);
}
}
if(cnt==8){
cout<<cnt<<endl;
return 0;
}
for(int j=0;j<8;j++){
if(g[0][j]!='W'){
cnt+=paintC(j);
}
}
cout<<cnt<<endl;
}
B. Memory Manager
居然因为赋初值 0 的时候 erase 0 会导致bug,事实证明读题的确要仔细看好数据范围 erase x 里的 x 是任意的32位整数,需要特殊判断。(其实只有 1 ≤ x ≤ idx 时才需要进入循环吧,不过是个水题就不优化了)
最后居然还把 == 号打成的 = 号再交一发 Wrong Answer ,菜啊。
#include<bits/stdc++.h>
using namespace std;
int t,m;
int mem[105];
int alloc(int n,int idx){
for(int i=n-1;i<m;i++){
int suc=1;
for(int j=0;j<n;j++){
if(mem[i-j]){
suc=0;
break;
}
}
if(suc){
for(int j=0;j<n;j++){
mem[i-j]=idx;
}
return 1;
}
}
return 0;
}
int merase(int idx){
if(idx==0)
return 0;
int suc=0;
for(int i=0;i<m;i++){
if(mem[i]==idx){
mem[i]=0;
suc=1;
}
}
return suc;
}
void defragment(){
int cur=0;
stack<int>cnt;
for(int i=m-1;i>=0;i--){
if(mem[i]){
cnt.push(mem[i]);
mem[i]=0;
}
}
for(int i=0;i<m;i++){
if(cnt.empty())
break;
else{
mem[i]=cnt.top();
cnt.pop();
}
}
return;
}
void show(){
for(int i=0;i<m;i++){
printf("%d",mem[i]);
}
cout<<endl;
}
int main(){
cin>>t>>m;
string ins;
int insn;
int idx=1;
while(t--){
//show();
cin>>ins;
if(ins[0]=='a'){
cin>>insn;
if(alloc(insn,idx))
cout<<idx++<<endl;
else
cout<<"NULL\n";
}
else if(ins[0]=='e'){
cin>>insn;
if(merase(insn)){
;
}
else{
cout<<"ILLEGAL_ERASE_ARGUMENT\n";
}
}
else{
defragment();
}
}
//show();
}
C.