arrows blog

解いた問題などを適当に書いていきます。

SRM 667 div2 Easy Med

Easy

問題文

省略

解法

全探索

コード

class PointDistance {
public:
    int dist(int x1,int y1,int x2,int y2){
	return pow(x1-x2,2.)+pow(y1-y2,2.);
    }
    vector <int> findPoint(int x1, int y1, int x2, int y2) {
	for(int x3 = -100 ; x3 <= 100 ; x3++){
	    for(int y3 = -100 ; y3 <= 100 ; y3++){
		int d1 = dist(x1,y1,x3,y3);
		int d2 = dist(x2,y2,x3,y3);
		if(d1 > d2){
		    return vector<int>{x3,y3};
		}
	    }
	}
	return vector<int>{};
    }

Med

問題文

省略

解法

BitDP.
dp[どの命令を実行したかのbit] := 最短実行時間

最初、
dp[今何個目の命令を実行しているか][どのセルを使ったか] := 最短実行時間
でやっていたが、これでも通った.

コード

#define INF 1e9

int dp[1<<20];

class OrderOfOperationsDiv2 {
public:
    int N,M,bit[20];
   
    int solve(int idx,int S,int used,vector<string> &s){
	if(idx == N) return 0;
	int &res = dp[used];
	if(res != -1) return res;
	res = INF;
	for(int i = 0 ; i < N ; i++){
	    if(used >> i & 1) continue;
	    int c = 0;
	    for(int j = 0 ; j < M ; j++){
		if(!(S >> j & 1) && (bit[i] >> j & 1)) ++c;
	    }
	    res = min(res,solve(idx+1,S|bit[i],used|(1<<i),s) + (int)pow(c,2.));
	}
	return res;
    }
    
    int minTime(vector<string> &s) {
	memset(dp,-1,sizeof(dp));
	N = s.size(), M = s[0].size();
	for(int i = 0 ; i < N ; i++){
	    bit[i] = 0;
	    for(int j = 0 ; j < M ; j++){
		if(s[i][j] == '1'){
		    bit[i] |= 1<<j;
		}
	    }
	}
	return solve(0,0,0,s);
    }
}