QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#526463#8774. Manhattan WalkOneWan#WA 0ms13776kbC++234.8kb2024-08-21 16:29:252024-08-21 16:29:25

Judging History

你现在查看的是最新测评结果

  • [2024-08-21 16:29:25]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:13776kb
  • [2024-08-21 16:29:25]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using i64 = long long; 
#define len 50
int ss[len][len][len][2505];  //0 pre 1 now
int pre[len][len][len][2505];
int idx=0;
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, k;
    cin >> n >> k;
    string s;
    cin >> s;
    set<int>st;
    st.insert(0);
    s=" "+s;
    ss[0][0][0][0]=1;
    for (int i = 1; i <= n; i++) {  
        if(s[i] != 'N' && s[i] != 'A' && s[i] != 'C' && s[i] != '?') {
            for(int x=0;x<=40;x++){
            	for(int y=0;y<=40;y++){
            		for(int cnt=0;cnt<=2500;cnt++){ 
	            		if(ss[i-1][x][y][cnt]){
	            			ss[i][x][y][cnt]=++idx;
	            			pre[i][x][y][cnt]=ss[i-1][x][y][cnt];
	            		} 
            		}
            	}
            }
            continue;
        } 
        if(s[i] == 'N') {
            //set<int>nst;
//             
            // for (auto &a : st) {
            	// auto [x, y, cnt] = re(a);
                // if(!nst.count(get(x + 1, y, cnt))) 
                    // nst.insert(get(x + 1, y, cnt));
            // }
            // swap(st, nst);
            for(int x=0;x<=40;x++){
            	for(int y=0;y<=40;y++){
            		for(int cnt=0;cnt<=2500;cnt++){
            			if(ss[i-1][x][y][cnt]&&ss[i][x+1][y][cnt]==0){
            				ss[i][x+1][y][cnt]=++idx;
            				pre[i][x+1][y][cnt]=ss[i-1][x][y][cnt];
            			}
            		}
            	}
            }
        }
        if(s[i] == 'A') {
            // set<int>nst;
            // for (auto &a : st) {
            	       	// auto [x, y, cnt] = re(a);
                // if(!nst.count(get(x, y + x, cnt))) 
                    // nst.insert(get(x, y + x, cnt));
            // }
            // swap(st, nst);
            
             for(int x=0;x<=40;x++){
            	for(int y=0;y<=40;y++){
            		for(int cnt=0;cnt<=2500;cnt++){
            			if(ss[i-1][x][y][cnt]&&ss[i][x][y+x][cnt]==0){
            				ss[i][x][y+x][cnt]=++idx;
            				pre[i][x][y+x][cnt]=ss[i-1][x][y][cnt];
            			}
            		}
            	}
            }
        }
        if(s[i] == 'C') {
            // set<int>nst;
            // for (auto &a : st) {
            	 	// auto [x, y, cnt] = re(a);
                // if(cnt + y <= k && !nst.count(get(x, y, cnt + y))) 
                    // nst.insert(get(x, y, cnt + y));
            // }
            // swap(st, nst);
              for(int x=0;x<=40;x++){
            	for(int y=0;y<=40;y++){
            		for(int cnt=0;cnt<=2500;cnt++){
            			if(!ss[i-1][x][y][cnt])continue;
            			if(cnt+y<=k&&ss[i][x][y][cnt+y]==0){
            				ss[i][x][y][cnt+y]=++idx;
            				pre[i][x][y][cnt+y]=ss[i-1][x][y][cnt];
            			}
            		}
            	}
            }
        }
        if(s[i] == '?') { 
            for(int x=0;x<=40;x++){
            	for(int y=0;y<=40;y++){
            		for(int cnt=0;cnt<=2500;cnt++){
            			if(!ss[i-1][x][y][cnt])continue;
            			if(ss[i-1][x][y][cnt]){
	            			ss[i][x][y][cnt]=++idx;
	            			pre[i][x][y][cnt]=ss[i-1][x][y][cnt];
	            		} 
            			if(ss[i-1][x][y][cnt]&&ss[i][x+1][y][cnt]==0){
            				ss[i][x+1][y][cnt]=++idx;
            				pre[i][x+1][y][cnt]=ss[i-1][x][y][cnt];
            			}
            			if(ss[i-1][x][y][cnt]&&ss[i][x][y+x][cnt]==0){
            				ss[i][x][y+x][cnt]=++idx;
            				pre[i][x][y+x][cnt]=ss[i-1][x][y][cnt];
            			}
            			if(cnt+y<=k&&ss[i][x][y][cnt+y]==0){
            				ss[i][x][y][cnt+y]=++idx;
            				pre[i][x][y][cnt+y]=ss[i-1][x][y][cnt];
            			}
            		}
            	}
            }
          
        } 
    }  
    int i = n, x = -1, y = -1, cnt = k;
	for (int x1 = 0; x1 <= 40; x1++)
		for (int y1 = 0; y1 <= 40; y1++) {
			if(ss[n][x1][y1][k]) x = x1, y = y1;
		}
		
    if((x==-1)&&(y==-1)) {
    	cout << "-1\n";
    	return 0;
    }
    
    vector<char>ans;
    
    while(1) {
    	if(i==0)break;
    	if(pre[i][x][y][cnt] == ss[i - 1][x][y][cnt]) {
    		i--;
    		ans.push_back('B');
    		continue; 
    	}
    	if(pre[i][x][y][cnt] == ss[i - 1][x - 1][y][cnt]) {
    		x = x - 1;
    		i--;
    		ans.push_back('N');
    		continue; 
    	}
    	if(y - x >= 0 && pre[i][x][y][cnt] == ss[i - 1][x][y - x][cnt]) {
    		y -= x;
    		i--;
    		ans.push_back('A');
    		continue; 
    	}
    	if(pre[i][x][y][cnt] == ss[i - 1][x][y][cnt - y]) {
    		cnt -= y;
    		i--;
    		ans.push_back('C');
    		continue; 
    	}
    }
    
    for (int i = ans.size() - 1; i >= 0; i--) cout << ans[i];
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 13776kb

input:

2 3 8

output:

-1

result:

wrong answer 1st numbers differ - expected: '2.8750000', found: '-1.0000000', error = '1.3478261'