--- 題型 ---

放剩下 相關的題目 ψ(._. )>

/*
 *  zerojudge
 *  f637. DF-expression
 *  AC (81ms, 3.4MB)
 */
#include <bits/stdc++.h>
using namespace std;

string s;
int D;

int solve(int &i, int cnt) {
    if (i >= s.size()) {
        return 0;
    }   
    //
    if (s[i] == '1') {
    	i++;
        return D / cnt;
    } else if (s[i] == '2') {
    	i++;
        int sum = 0;
        for (int j = 0; j < 4; j++) {
            sum += solve(i, cnt * 4);
        }
        return sum;
    } else if (s[i] == '0') {
    	i++;
        return 0;
    }
    return 0;
}

int main() {
    cin >> s;
    int n;
    cin >> n;
    D = n * n;
    int i = 0;
    cout << solve(i, 1) << endl;
    return 0;
}

/*
 * AP325
 * P-1-7. 子集合乘積
*/
#include<bits/stdc++.h>
using namespace std;
int n;

int f(int a[],int i,int sum){
	if(i>=n){
		cout << sum << endl;
		return 0;
	}
	f(a, i + 1, ((sum==0) ? 1 : sum) * a[i]);
    f(a, i + 1, sum);
}

int main(){
	cin >> n;
	int a[n];
	int p=10009;
	for(int i=0;i<n;i++){
		cin >> a[i];
	}
	f(a,0,0);
}

/*
 * AP325
 * Q-1-8. 子集合的和
*/
#include<bits/stdc++.h>
using namespace std;

int n,P;
vector<int> a;
int max_sum = -1;

void f(int cnt, int sum) {
    if (cnt == n) {
        if (sum <= P) {
            max_sum = max(max_sum, sum);
        }
        return;
    }
    f(cnt + 1, sum);
    f(cnt + 1, sum + a[cnt]);
}

int main(){
	cin >> n >> P;
	for(int i=0;i<n;i++){
		int x;
		cin >> x;
		a.push_back(x);
	}
	f(0,0);
	cout << max_sum << endl;
}

/*
 * AP325
 * P-1-9. N-Queen 解的個數
*/
#include<bits/stdc++.h>
using namespace std;
#define fastio ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

int n;
int cnt = 0;

int solve(int row,int col,vector<vector<int>> &board){
	if(row>=n){    
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < n; ++j) {
				cout << board[i][j] << " ";
			}
			cout << "\n";
		}
		cout << "\n";
		cnt+=1;
		return 0;
	}
	for (int col = 0; col < n; col++) { //試橫的
		bool isOk = true;
		// 檢查|直的
		for (int i = 0; i < row; ++i) {
		    if (board[i][col] == 1) {
		        isOk=false;
		    }
		}
		// 檢查\主對角線
		for (int i = row, j = col; i >= 0 && j >= 0; --i, --j) {
		    if (board[i][j] == 1) {
		            isOk=false;
		    }
		}
		// 檢查/副對角線
		for (int i = row, j = col; i >= 0 && j < n; --i, ++j) {
		    if (board[i][j] == 1) {
		        isOk=false;
		    }
		}
		//
		int isPut = false;
		if(isOk){ //可以放為1 往下走
			isPut = true;
            board[row][col] = 1; 
            solve(row+1,col, board);
            board[row][col] = 0;
        }
        if(col==n-1 && isPut==false){
        	solve(row+1,0, board);
        }
	}
	return 0;
}
int main(){
    cin >> n;
    vector<vector<int>>board(n, vector<int>(n, 0));
    solve(0,0,board);
    cout << "all: " << cnt << endl;
}

/*
 * AP325
 * Q-1-10. 最多得分的皇后
*/
#include<bits/stdc++.h>
using namespace std;
#define fastio ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

int n;
int cnt = 0;
int max_sum = 0;

int solve(int row,int col,vector<vector<int>> &board,vector<vector<int>> &score){
	if(row>=n){    
		int sum = 0;
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < n; ++j) {
				cout << board[i][j] << " ";
			    if(board[i][j]){
			    	sum+=score[i][j];
			    }
			}
			cout << "\n";
		}
		cout << "\n";
		max_sum = (max_sum>sum) ? max_sum : sum;
		return 0;
	}
	for (int col = 0; col < n; col++) { //試橫的
		bool isOk = true;
		// 檢查|直的
		for (int i = 0; i < row; ++i) {
		    if (board[i][col] == 1) {
		        isOk=false;
		    }
		}
		// 檢查\主對角線
		for (int i = row, j = col; i >= 0 && j >= 0; --i, --j) {
		    if (board[i][j] == 1) {
		            isOk=false;
		    }
		}
		// 檢查/副對角線
		for (int i = row, j = col; i >= 0 && j < n; --i, ++j) {
		    if (board[i][j] == 1) {
		        isOk=false;
		    }
		}
		//
		int isPut = false;
		if(isOk){ //可以放為1 往下走
			isPut = true;
            board[row][col] = 1; 
            solve(row+1,col, board,score);
            board[row][col] = 0;
        }
        if(col==n-1 && isPut==false){
        	solve(row+1,0, board,score);
        }
	}
	return 0;
}
int main(){
    cin >> n;
    vector<vector<int>>board(n, vector<int>(n, 0));
    vector<vector<int>>score(n, vector<int>(n, 0));
    for(int i=0;i<n;i++){
    	for(int j=0;j<n;j++){
    		cin >> score[i][j];
    	}
    }
    solve(0,0,board,score);
    cout << "all: " << cnt << endl;
    cout << "max score: " << max_sum << endl;
}

/*
 * NeetCode
 * Products of Array Discluding Self
*/
class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        vector<int>v;
        int n = nums.size();
        int lS[n];
        int rS[n];
        lS[0]=nums[0];
        rS[n-1]=nums[n-1];
        for(int i=1;i<n;++i){
            lS[i]=lS[i-1]*nums[i];
            rS[n-1-i]=rS[n-i]*nums[n-1-i];
        }
        //
        for(int i=0;i<n;i++){
            if(i==0){
                v.push_back(rS[i+1]);
            }else if(i==n-1){
                v.push_back(lS[n-1-1]);
            }else{
                v.push_back(lS[i-1]*rS[i+1]);
            }
        }
        return v;
    }
};

/* 
 * CSES
 * Restaurant Customers
*/
#include<bits/stdc++.h>
using namespace std;

struct P{
	int time;
	bool state; // 0 left 1 right
};

bool cmp(P a, P b){
	return a.time<b.time;
}

int main(){
	int n;
	vector<P>v;
	cin >> n;
	for(int i=0;i<n;++i){
		P a,b;
		cin >> a.time >> b.time;
		a.state = 0;
		b.state = 1;
		v.push_back(a);
		v.push_back(b);
	}
	sort(v.begin(),v.end(),cmp);
	//
	int cnt = 0;
	int M = -1;
	for(int i=0;i<2*n;++i){
		if(v[i].state==0){
			cnt+=1;
		}else if(v[i].state==1){
			cnt-=1;
		}
		//
		if(cnt > M){
			M = cnt;
		}
	}
	cout << M << endl;
}

/*
 * CSES
 * Static Range Sum Queries
*/
#include<bits/stdc++.h>
using namespace std;

int main(){
	int n,q;
	cin >> n >> q;
	int v[n+1];
	int sum = 0;
	for(int i=1;i<=n;++i){
		int x;
		cin >> x;
		sum+=x;
		v[i]=sum;
	}
	for(int i=0;i<q;++i){
		int a,b;
		cin >> a >> b;
		cout << v[b]-v[a-1] << endl;
	}
}

/*
 * AP325
 * Q-3-13. X 差值範圍內的最大 Y 差值
*/
#include<bits/stdc++.h>
using namespace std;

int main() {
    int n, l;
    cin >> n >> l;
    unordered_map<int, pair<int, int>> ht;
    vector<pair<int, int>> v;
    int M = -1;
    for (int i = 0; i < n; ++i) {
        int x;
        cin >> x;
        if (ht.count(x + l)) {
            v.push_back({ht[x + l].second, i});
        }
        if (ht.count(x - l)) {
            v.push_back({ht[x - l].second, i});
        }
        ht[x] = {x, i};
    }

    int y[n];
    for (int i = 0; i < n; ++i) {
        cin >> y[i];
    }

    for (auto num : v) {
        M = max(M, abs(y[num.second] - y[num.first]));
    }

    cout << M << endl;

    return 0;
}

#include<bits/stdc++.h>
using namespace std;

int n;
int m = INT_MAX;

void f(int p[],int sum1,int sum2,int i){
	if(i==n){
		m = min(abs(sum1-sum2),m);
		return;
	}
	//
	sum1+=p[i];
	f(p,sum1,sum2,i+1);
	sum1-=p[i];
	//
	sum2+=p[i];
	f(p,sum1,sum2,i+1);
	sum2-=p[i];
}

int main(){
	cin >> n;
	int p[n];
	for(int i=0;i<n;++i){
		cin >> p[i];
	}
	f(p,0,0,0);
	cout << m << endl;
}

/*
 * CSES
 * Creating Strings
*/
#include<bits/stdc++.h>
using namespace std;

vector<char>v;
vector<string>v2;
int main(){
	string s;
	cin >> s;
	for(int i=0;i<s.size();++i){
		v.push_back(s[i]);
	}
	sort(v.begin(),v.end());
	int cnt = 0;
	do {
		string x = "";
	    for (int i = 0; i < v.size(); i++) {
	    	x+=v[i];
	    }
	    v2.push_back(x);
	    cnt+=1;
	} while (next_permutation(v.begin(), v.end()));
	//
	cout << cnt << endl;
	for(string x:v2){
		cout << x << endl;
	}
}

/*
 * codeforces
 * E. Special Elements
*/
#include<bits/stdc++.h>
using namespace std;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        vector<int> arr(n);
        set<int>s;
        for(int i=0; i<n; ++i) {
            cin >> arr[i];
        }
        for(int l=0;l<n; ++l) {
            int sum = arr[l];
            for (int r=l+1; r<n; ++r) {
                sum += arr[r];
                if (sum > n){
                    break;
                }else{
                    for (int i = 0; i < n; ++i) {
                        if (arr[i] == sum) {
                            s.insert(i);
                        }
                    }
                }
            }
        }
        cout << s.size() << endl;
    }
    return 0;
}

/*
 * NCOJ
 * 99 . [Tutorial] 趕不完的作業 2
*/
#include<bits/stdc++.h>
using namespace std;

bool cmp(int a,int b){
    return a<b;
}

int main(){
    int n,l;
    cin >> n >> l;
    int arr[n];
    for(int i=0;i<n;++i){
        cin >> arr[i];
    }
    sort(arr,arr+n,cmp);
    int t = 0;
    int ans = 0;
    for(int i=0;i<n;++i){
        if (t+l <= arr[i]) {
            t += l;
            ans += 1;
        }
    }
    cout << ans << endl;
}

/*
 * TIOJ
 * 1356. 河內之塔-便當塔
*/
#include<bits/stdc++.h>
using namespace std;

int cnt = 0;

void f(int n, int from, int temp, int to) {
    if (n == 1) {
        cnt += 1;
        printf("#%d : move the dish from #%d to #%d\n", cnt, from, temp);
        //
        cnt += 1;
        printf("#%d : move the dish from #%d to #%d\n", cnt, temp, to);
        //
        return;
    }
    f(n - 1, from, temp, to);
    //
    cnt += 1;
    printf("#%d : move the dish from #%d to #%d\n", cnt, from, temp);
    //
    f(n - 1, to, temp, from);
    //
    cnt += 1;
    printf("#%d : move the dish from #%d to #%d\n", cnt, temp, to); 
    //
    f(n - 1, from, temp, to);
}

int main() {
    int n;
    cin >> n;
    f(n, 1, 2, 3);
}

/*
 * zerojudge
 * i644. 列舉八皇后問題所有解
*/
#include<bits/stdc++.h>
using namespace std;

int ans = 0;

// 檢查是否可以放置皇后
bool isSafe(int table[8][8], int row, int col) {
    for (int i = 0; i < row; i++) {
        if (table[i][col]) {
            return false;
        }
    }

    for (int i = row, j = col; i >= 0 && j >= 0; i--, j--) {
        if (table[i][j]) {
            return false;
        }
    }

    for (int i = row, j = col; i >= 0 && j < 8; i--, j++) {
        if (table[i][j]) {
            return false;
        }
    }

    return true;
}

// 使用回溯法解 N 皇后問題
void queens(int table[8][8], int row,vector<int> &result) {
    if (row == 8) {
        ans+=1;
        printf("%d: %d%d%d%d%d%d%d%d\n",ans,result[0],result[1],result[2],result[3],result[4],result[5],result[6],result[7]);
        return;
    }

    for (int i = 0; i < 8; i++) {
        if (isSafe(table, row, i)) { // 檢查是否安全
            table[row][i] = 1; // 放置皇后
            result[row] = i+1;
            queens(table, row + 1,result); // 繼續放置下一行的皇后
            table[row][i] = 0; // 回溯
            result[row] = 0;
        }
    }
}

int main() {
    int table[8][8] = {0}; // 初始化棋盤
    vector<int>result(8);
    queens(table,0,result); // 開始從第 0 行放置皇后
    return 0;
}

/*
 * CSES
 * Maximum Subarray Sum
*/
#include<bits/stdc++.h>
using namespace std;

int n;
int a[400000]; // 2*100000

int main(){
    cin >> n;
    int a[n];
    for(int i=0;i<n;++i){
        cin >> a[i];
    }
    //
    int now_M = a[0];
    int ans_M = a[0];
    for(int i=1;i<n;++i){
        now_M = max(now_M+a[i],a[i]);
        ans_M = max(ans_M,now_M);
    }
    //
    cout << ans_M << endl;
}
/*
 * zerojudge
 * g597. 3. 生產線
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,m;
    cin>>n>>m;
    vector<long long>t(n+1);
    vector<long long>diff(n+2,0);
    //
    for(int i=1;i<=m;++i){
        int l,r,w;
        cin >> l >> r >> w;
        diff[l] += w;
        diff[r+1] -= w;
    }
    for(int i=1;i<=n;++i){
        cin >> t[i];
    }
    //
    vector<int>demand(n+1,0);
    demand[1] = diff[1];
    for(int i=2;i<=n;++i){
        demand[i] = demand[i-1] + diff[i];
    }
    //
    demand.erase(demand.begin());
    t.erase(t.begin());
    sort(t.begin(),t.end());
    sort(demand.rbegin(),demand.rend());
    //
    long long total_time=0;
    for(int i=0;i<n;++i){
        total_time += (t[i]*demand[i]);
    }
    cout << total_time << endl;
    //
    return 0;
}

Last updated

Was this helpful?