實作題

C++

出題內容:

一維 array[ ]
/*
 * zerojudge
 * f605. 1. 購買力
*/
#include<bits/stdc++.h>
using namespace std;

int main(){
	int n,d;
	cin >> n >> d;
	int sum = 0;
	int cnt = 0;
	while(n--){
		int x=0,M=0,m=0,now=0;
		cin >> x;
		now += x;
		M = x;
		m = x;
		cin >> x;
		now += x;
		M = max(M,x);
		m = min(m,x);
		cin >> x;
		now += x;
		M = max(M,x);
		m = min(m,x);
		//
		if(M-m>=d){
			cnt += 1;
			sum += now/3;
		}
	}
	cout << cnt << " " << sum << endl;
}
二維 array[ ][ ]
/*
 * zerojudge
 * f606. 2. 流量
*/
#include<bits/stdc++.h>
using namespace std;

int main() {
    int n, m, k;
    cin >> n >> m >> k;

    int server[55][55];

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

    int minCost = INT_MAX;

    while (k--) {
        int flow[55][55] = {0};
        int city, cost = 0;

        for (int i = 0; i < n; i++) {
            cin >> city;
            for (int j = 0; j < m; j++) {
                flow[city][j] += server[i][j];
            }
        }

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < m; j++) {
                if (i == j) {
                    cost += flow[i][j];
                } else {
                    if (flow[i][j] >= 1000) {
                        cost += 3000 + 2 * (flow[i][j] - 1000);
                    } else {
                        cost += 3 * flow[i][j];
                    }
                }
            }
        }

        minCost = min(minCost, cost);
    }

    cout << minCost << endl;

    return 0;
}
資料結構 Set
/*
 * zerojudge
 * f607. 3. 切割費用
*/
#include<bits/stdc++.h>
using namespace std;

set<int>st;

int main(){
	long long ans=0;
	int n,l;
    cin >> n >> l;
    int cut[n+1];
    for(int i=1;i<=n;i++){
    	int a,b;
        cin >> a >> b;
        cut[b] = a;
    }
    st.insert(0);
    st.insert(l);
    for(int i=1;i<=n;i++){
        st.insert(cut[i]);
        auto pre=st.find(cut[i]);
        auto nxt=st.find(cut[i]);
        pre--;
        nxt++;
        ans+=*nxt-*pre;
    }
    cout<<ans;
}
演算法 LIS
/*
 * zerojudge
 * f608. 4. 飛黃騰達
*/
#include<bits/stdc++.h>
using namespace std;

struct T{
	int x;
	int y;
};

bool cmp(T a,T b){
	return a.x<b.x;
}

int main(){
	int n;
	cin >> n;
	T food[n];
	vector<int> dp(n, 1);
	for(int i=0;i<n;++i){
		cin >> food[i].x >> food[i].y;
	}
	sort(food,food+n,cmp);
	//
	vector<int> ans;

    for(T num : food) {
        if (ans.empty() || ans.back() < num.y) {
            ans.push_back(num.y); // 大於 代表有遞增
        } else {
            auto it = upper_bound(ans.begin(), ans.end(), num.y);
            *it = num.y; // 換小點的y 有可能可以接更多
        }
    }

    cout << ans.size() << endl;

    return 0;
}

Last updated

Was this helpful?