hsg tin 12 2020 có giải và test

- 0 / 0
(Tài liệu chưa được thẩm định)
Nguồn:
Người gửi: Lê Anh Đào
Ngày gửi: 13h:34' 12-12-2023
Dung lượng: 1.5 MB
Số lượt tải: 41
Nguồn:
Người gửi: Lê Anh Đào
Ngày gửi: 13h:34' 12-12-2023
Dung lượng: 1.5 MB
Số lượt tải: 41
Số lượt thích:
1 người
(Vương Văn Cường)
Bài 1: Dùng cấu trúc tuần tự, lặp (Dạng đề "làm theo yêu cầu") Vì K <= 9 nên D sẽ có giá trị từ 2 tới 10 (Hệ nhị
phân tới hệ thập phân) Liên tục thực hiện thao tác lấy số dư của phép chia N chia cho D cho tới khi số dư của nó
khác K, số lần thực hiện được chính là số lượng số K ở phần cuối của N khi chuyển sang hệ số D. Từ đó tìm ra
được đáp án
#include
using namespace std;
#define int long long
#define pii pair
#define fi first
#define se second
#define endl '\n'
#define TASK "chuyendoi"
int n, k;
int val(int d) {
int ret = 0;
int N = n;
while(N % d == k) {
++ret;
N /= d;
}
return ret;
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
if(fopen(TASK".inp", "r")) {
freopen(TASK".inp", "r", stdin);
freopen(TASK".out", "w", stdout);
}
cin >> n >> k;
int ans1, ans2 = -1;
for(int d = 2; d <= 10; ++d) {
int tmp = val(d);
if(tmp > ans2) {
ans1 = d;
ans2= tmp;
}
}
cout << ans1 << ' ' << ans2;
}
Bài 2: Dùng QHĐ
Gọi F[i] là chi phí nhỏ nhất để trả tiền vé cho i người đầu tiên (người 1 -> i)
Với mỗi người có số thứ tự lớn hơn hoặc bằng 1 ( i >= 1):
TH1: Người thứ i không nhờ ai mua vé hộ (F[i] = F[i - 1] + a[i])
Với mỗi người có số thứ tự lớn hơn hoặc bằng 2 (i >= 2):
TH2: Người thứ i tự mua vé hoặc nhờ người i - 1 mua vé hộ F[i] = min(TH1, F[i - 2] + b[i - 1])
Với mỗi người có số thứ tự lớn hơn hoặc bằng 3 (i >= 3):
TH3: Người thứ i tự mua vé, hoặc nhờ người thứ i - 1 mua vé hộ, hoặc nhờ người thứ i - 2 mua vé cho cả 3 người
F[i] = min(TH1, TH2, F[i - 3] + c[i - 2])
#include
using namespace std;
//Num
#define int long long
#define ld long double
//Vector or String
#define all(v) v.begin(), v.end()
#define sor(v) sort(all(v))
#define sz(v) (long long) v.size()
#define remu(v) v.erase(unique(all(v)), end(v))
#define pb push_back
#define eb emplace_back
//Pair Map
#define fi first
#define se second
#define pii pair
#define mii map
#define mib map
//Loop
#define fou(i, a, b) for(int i = a; i <= b; i++)
#define fod(i, a, b) for(int i = a; i >= b; i--)
//Gragh
const int dx[8] = {0, 0, 1, -1, -1, -1, 1, 1};
const int dy[8] = {1, -1, 0, 0, -1, 1, -1, 1};
//Some Func
template bool ckmin(T &a, const T &b) {
return b < a ? a = b, 1 : 0;
}
template bool ckmax(T &a, const T &b) {
return a < b ? a = b, 1 : 0;
}
string its(int n) {
stringstream ss;
ss << n;
string s;
ss >> s;
return s;
}
int sti(string s) {
stringstream ss;
ss << s;
int n;
ss >> n;
return n;
}
//Input Output
#define FIO ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define TASK "MUAVE"
#define el '\n'
//Mod MaxN
const int MOD = 1e9 + 7;
const int MAX = 2e5 + 1;
const int INF = 1e18;
const ld PI = acos((ld)-1);
void solve() {
int n;
cin >> n;
int a[n + 1], b[n + 1], c[n + 1], f[n + 1];
for(int i = 1; i <= n; i++) {
cin >> a[i] >> b[i] >> c[i];
}
f[0] = 0;
for(int i = 1; i <= n; i++) {
f[i] = f[i - 1] + a[i];
if(i > 1) f[i] = min(f[i], f[i - 2] + b[i - 1]);
if(i > 2) f[i] = min(f[i], f[i - 3] + c[i - 2]);
}
cout << f[n];
}
signed main() {
FIO;
freopen(TASK".inp", "r", stdin); freopen(TASK".out", "w", stdout);
int Q = 1;
//cin >> Q;
while(Q--) {
solve();
}
}
phân tới hệ thập phân) Liên tục thực hiện thao tác lấy số dư của phép chia N chia cho D cho tới khi số dư của nó
khác K, số lần thực hiện được chính là số lượng số K ở phần cuối của N khi chuyển sang hệ số D. Từ đó tìm ra
được đáp án
#include
using namespace std;
#define int long long
#define pii pair
#define fi first
#define se second
#define endl '\n'
#define TASK "chuyendoi"
int n, k;
int val(int d) {
int ret = 0;
int N = n;
while(N % d == k) {
++ret;
N /= d;
}
return ret;
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
if(fopen(TASK".inp", "r")) {
freopen(TASK".inp", "r", stdin);
freopen(TASK".out", "w", stdout);
}
cin >> n >> k;
int ans1, ans2 = -1;
for(int d = 2; d <= 10; ++d) {
int tmp = val(d);
if(tmp > ans2) {
ans1 = d;
ans2= tmp;
}
}
cout << ans1 << ' ' << ans2;
}
Bài 2: Dùng QHĐ
Gọi F[i] là chi phí nhỏ nhất để trả tiền vé cho i người đầu tiên (người 1 -> i)
Với mỗi người có số thứ tự lớn hơn hoặc bằng 1 ( i >= 1):
TH1: Người thứ i không nhờ ai mua vé hộ (F[i] = F[i - 1] + a[i])
Với mỗi người có số thứ tự lớn hơn hoặc bằng 2 (i >= 2):
TH2: Người thứ i tự mua vé hoặc nhờ người i - 1 mua vé hộ F[i] = min(TH1, F[i - 2] + b[i - 1])
Với mỗi người có số thứ tự lớn hơn hoặc bằng 3 (i >= 3):
TH3: Người thứ i tự mua vé, hoặc nhờ người thứ i - 1 mua vé hộ, hoặc nhờ người thứ i - 2 mua vé cho cả 3 người
F[i] = min(TH1, TH2, F[i - 3] + c[i - 2])
#include
using namespace std;
//Num
#define int long long
#define ld long double
//Vector or String
#define all(v) v.begin(), v.end()
#define sor(v) sort(all(v))
#define sz(v) (long long) v.size()
#define remu(v) v.erase(unique(all(v)), end(v))
#define pb push_back
#define eb emplace_back
//Pair Map
#define fi first
#define se second
#define pii pair
#define mii map
#define mib map
//Loop
#define fou(i, a, b) for(int i = a; i <= b; i++)
#define fod(i, a, b) for(int i = a; i >= b; i--)
//Gragh
const int dx[8] = {0, 0, 1, -1, -1, -1, 1, 1};
const int dy[8] = {1, -1, 0, 0, -1, 1, -1, 1};
//Some Func
template
return b < a ? a = b, 1 : 0;
}
template
return a < b ? a = b, 1 : 0;
}
string its(int n) {
stringstream ss;
ss << n;
string s;
ss >> s;
return s;
}
int sti(string s) {
stringstream ss;
ss << s;
int n;
ss >> n;
return n;
}
//Input Output
#define FIO ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define TASK "MUAVE"
#define el '\n'
//Mod MaxN
const int MOD = 1e9 + 7;
const int MAX = 2e5 + 1;
const int INF = 1e18;
const ld PI = acos((ld)-1);
void solve() {
int n;
cin >> n;
int a[n + 1], b[n + 1], c[n + 1], f[n + 1];
for(int i = 1; i <= n; i++) {
cin >> a[i] >> b[i] >> c[i];
}
f[0] = 0;
for(int i = 1; i <= n; i++) {
f[i] = f[i - 1] + a[i];
if(i > 1) f[i] = min(f[i], f[i - 2] + b[i - 1]);
if(i > 2) f[i] = min(f[i], f[i - 3] + c[i - 2]);
}
cout << f[n];
}
signed main() {
FIO;
freopen(TASK".inp", "r", stdin); freopen(TASK".out", "w", stdout);
int Q = 1;
//cin >> Q;
while(Q--) {
solve();
}
}
 









Các ý kiến mới nhất