小屋創作

日誌2020-07-04 19:15

7/4 APCS

作者:路過的一隻山姆

更 觀念5 實作4 ==
===================================================================
今天是我第一次考APCS
難度感覺還好
觀念很簡單 實作也不難
我在這裡打我實作的解法(不一定正確 我也不太記得題目了)

pA 給a,b兩個數字 和一個m
     執行m次 每次會有100個以內的數字
     數字是正的->拿物品
     數字是負的->放回去
     問同時拿到a,b有幾次
     這題就紀錄每次拿了a,b幾次就解決了
程式碼
#include <bits/stdc++.h>

#define ll long long
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

int main(){
fastio
int a,b,m, ans = 0;
cin >> a >> b >> m;
while(m--){
int tmp, cnt1 = 0, cnt2 = 0;
cin >> tmp;
while(cin >> tmp){
if(tmp==0) break;
if(tmp > 0){
if(tmp == a) cnt1++;
if(tmp == b) cnt2++;
}
else{
if(tmp == -a) cnt1–;
else if(tmp ==-b) cnt2–;
}
}
if(cnt1&&cnt2) ans++;
}
cout << ans << "\n";
}
pB 給n個骰子 進行m次操作
     骰子一開始都是由1朝上 由4朝前
     每次操作有a,b兩個數字
     當b是正的時候 把a,b兩骰子調換
     如果b是-1把骰子往前轉
            b是-2把骰子往右轉
     問進行操作之後每個骰子上方的數字
     用一個三項的陣列存每個骰子的上前右
程式碼
#include <bits/stdc++.h>

#define ll long long
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

int main(){
fastio
int n,m;
cin >> n >> m;
array<int,3> arr[n];
for(int i = 0;i < n;i++) arr[i] = {1,4,2};
while(m--){
int a,b;
cin >> a >> b;
a--;
if(b > 0){
b--;
array<int,3> tmp = arr[a];
arr[a] = arr[b];
arr[b] = tmp;
}else{
if(b == -1){
int tmp = arr[a][1];
arr[a][1] = arr[a][0];
arr[a][0] = 7 - tmp;
}else{
int tmp = arr[a][2];
arr[a][2] = arr[a][0];
arr[a][0] = 7 - tmp;
}
}
}
for(int i = 0;i < n;i++) cout << arr[i][0] << " ";
}
pC 給n個房間連成一環跟m把鑰匙 離開每個房間有各自的點數
     要照順序(0->1->2->...->n-1->0->1->...)走
     達到一定的點數就能得到鑰匙 但是點數會歸零
     問最後停留的房間
     我自己是用前綴和加二分搜去解
程式碼
#include <bits/stdc++.h>

#define ll long long
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

int n,m;
int binary_search(int arr[], int l, int r, int target){
while(l < r){
int mid = (l+r)/2;
int tmp = arr[mid%n] + (mid >= n ? arr[n-1] : 0);
if(tmp < target){
l = mid+1;
}else if(tmp > target){
r = mid-1;
}else{
return mid;
}
}
return l;
}

int main(){
fastio
cin >> n >> m;
int pref[n];
for(int i = 0;i < n;i++){
cin >> pref[i];
if(i!=0) pref[i] += pref[i-1];
}
int room = 0;
for(int t = 0, point;t < m;t++){
cin >> point;
room = (binary_search(pref,room,room+n, point + (room==0 ? 0 : pref[room-1])))%n+1;
}
cout << room << "\n";
}
pD 這題大概是這次最難的一題了
      有關DNA 給予n個樣本 DNA長度為m
      樣本一為根節點
      每個DNA當中會有@為未知的字元
      問最少變異次數
      
      這題是有關樹的題目 一般就是DFS或是BFS
      我自己用了兩次DFS
      先從葉節點開始填@
      第二次DFS再去算變異次數和把剩下的@填滿
      不確定是不是對的 不過測資不大 應該不會TLE
程式碼
#include <bits/stdc++.h>

#define ll long long
#define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

using namespace std;

const int N = 1e3+5;
vector<pair<int,string>> adj[N];

int diff(string &s1, string &s2){
int cnt = 0;
for(int i = 0;i < s1.size();i++){
if(s1[i]=='@'&&s2[i]!='@') s1[i] = s2[i];
else if(s1[i]!='@'&&s2[i]=='@') s2[i] = s1[i];
else if(s1[i]!=s2[i]) cnt++;
}
return cnt;
}

int ans = 0;
void dfs(int u, string &s){
for(auto &x : adj[u]){
dfs(x.first, x.second);
}
unordered_map<char,int> m;
for(int i = 0;i < s.size();i++){
if(s[i]!='@') continue;
m.clear();
for(auto &x : adj[u]){
if(x.second[i]!='@') m[x.second[i]]++;
}
if(!m.empty()) s[i] = max_element(m.begin(), m.end(), [&](pair<char,int> a, pair<char,int> b){return a.second < b.second;})->first;
}
for(auto &x : adj[u]){
for(int i = 0;i < s.size();i++)
if(x.second[i]=='@') x.second[i] = s[i];
}
}

void dfs2(int u, string &s){
//cout << u << " " << s << "\n";
for(auto &x : adj[u]){
ans += diff(s,x.second);
dfs2(x.first,x.second);
}
}

int main(){
fastio
int n,m;
cin >> n >> m;
string root;
while(n--){
int u,v;
string s;
cin >> u >> v >> s;
if(u==v){
root = s;
continue;
}
adj[v].push_back({u,s});
}
dfs(1,root);
dfs2(1,root);
cout << ans << "\n";
}
第一次考APCS 希望能拿4分以上 最好能有5分

5

14

LINE 分享

相關創作

+ 10~12月 自製遊戲開發進度+ (2024年底回顧!)

天外Online 2024/12/25改版新資料片臨江仙境-新的文片組合

【職業&飲食】2024/12/26、麥當勞&年末感言

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】