CSY 教徒們
\CSY 教我/
x1 = true
(!x1 || !x2 ) && !x3 == true
A. x2 True , x3 True
B. x2 True , x3 False
C. x2 False , x3 True
D. x2 False , x3 False
答案:D
使用輾轉相除法得到介於
A. 50
B. 500
C. 5000
D. 50000
答案:A
將兩個各項係數皆不爲
本題是一題 debug 題,題目大致如下,由於筆者記憶力不好,因此變數名稱與原題稍有出入:
typedef struct term {
int power, val;
} poly;
int add(poly a1[],poly a2[],poly a3[],int n1,int n2){
int id1 = id2 = id3 = 0;
while(id1 < n1 && id2 < n2){
if(a1[id1].power == a2[id2].power){
int sum = a1[id1].val + a2[id2].val;
if(sum == 0) continue;
a3[id3].power = a1[id1].power;
a3[id3].val = sum;
id1 = id1 + 1;
id2 = id2 + 1;
}
else if(a1[id1].power > a2[id2].power){
a3[id3].power = a1[id1].power;
a3[id3].val = a1[id1].val;
id1 = id1 + 1;
}
else{
a3[id3].power = a2[id2].power;
a3[id3].val = a2[id2].val;
id2 = id2 + 1;
}
id3 = id3 + 1;
}
while(id1 < n1){
a3[id3].power = a1[id1].power;
a3[id3].val = a1[id1].val;
id1 = id1 + 1;
}
while(id2 < n2){
a3[id3].power = a2[id2].power;
a3[id3].val = a2[id2].val;
id2 = id2 + 1;
}
return id3;
}
其實這有點像 merge_sort 中 merge 的過程,在盯了很久後會發現,問題出在這個 continue,在 continue 前並沒有將 idx1 與 idx2 加 1,因此若
欲在一個已排序好,大小為 n 的陣列 a[] 搜尋一個值 v 的位置。以下的code …(a)… 和 …(b)… 應填入什麼?
A.
B.
C.
D.
int find_value(int a[], int n, int v) {
int i = 0, j = n - 1, k;
while (...(a)...) {
k = ...(b)...;
if (a[k] == v) {
return k;
} else if (a[k] < v) {
i = k + 1;
} else {
j = k - 1;
}
}
return -1
}
答案:B
這題在考的是二分搜的細節觀念。程式碼中的
int n = 10000;
for(int i=0,j=0;i<n;i=i+1,j=j+3){
a[i] = j % 20;
}
int cnt = 0;
i = 0;
while(i<n){
if(a[i] == 11){
cnt = cnt + 1;
i = i + /*填空*/;
}
else{
i = i + 1;
}
}
printf("%d\n",cnt);
將數字由大排到小 code 很醜
int B[10] = {/*1~10 random shuffle*/}
int h(int x){
return x;
}
int g(int x, int y){
return h(y) - h(x);
}
void f(int n){
int tmp, i, j;
for(i = 0; i < n - 1; i++){
for(j = 0; j < n - i - 1; j++){
if(g(B[i], B[j]) > 0){
tmp = B[i];
B[i] = B[j];
B[j] = tmp;
}
}
}
}
將數字依 sum of … sum of digit 由小排到大
int B[10] = {/*每一種 h(x) 會有兩個*/}
int h(int x){
int sum = 0;
do{
sum = sum + x % 10;
x = x / 10;
}
while(x / 10);
if(sum / 10) return h(sum);
else return sum;
}
int g(int x, int y){
return h(x) - h(y);
}
void f(int n){
int tmp, i, j;
for(i = 0; i < n - 1; i++){
for(j = 0; j < n - i - 1; j++){
if(g(B[i], B[j]) > 0){
tmp = B[i];
B[i] = B[j];
B[j] = tmp;
}
}
}
}
題目來源:黃致皓、吳庭安
給定二數字
購物清單格式:
每筆以
Sample Input 1
1 8
5
1 8 0
5 6 0
2 7 0
8 1 0
33 22 0
Output 1
2
以一個陣列記錄每種物品當前個數,最後判斷兩個物品個數是否都大於 0。
//By Koios1143
#include<bits/stdc++.h>
#define LL long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define pii pair<int,int>
using namespace std;
int a,b,t,tmp,used[105];
int main(){
IOS
cin>>a>>b>>t;
int ans=0;
for(int i=0 ; i<t ; i++){
memset(used,0,sizeof(used));
while(cin>>tmp && tmp){
if(tmp>0)
used[tmp]++;
else
used[-tmp]--;
}
if(used[a]>0 && used[b]>0)
ans++;
}
cout<<ans<<"\n";
return 0;
}
res = 0
ls = list(map(int , input().strip().split(" ")))
r = int(input().strip())
for i in range(r):
s = list(map(int , (input().strip().split(" "))[:-1]))
for j in s:
if j < 0:
s.remove(abs(j))
if ls[0] in s and ls[1] in s:
res += 1
print(res)
給定
每筆操作格式如下:
若
若
若
最後依序輸出每個骰子上方的點數。
一開始骰子:
3 | |||
---|---|---|---|
5 | 1 | 2 | 6 |
4 |
1 2
1 -2
1 -1
3 3
2 -1
3 -2
3 1
分數 | 限制 |
---|---|
20 % | n = 1 , 操作只有翻滾 |
80 % | 無特別限制 |
直接紀錄每個點數向前與向右轉後的點數為何,每次直接轉移過去即可
由於對面相加爲 7,因此我們只需儲存其中上、前、右方之數字即可。向右翻轉時,原本的左方(7 - 右方數字)變爲新的上方,而原來的上方變爲新的右方,向前翻轉以此類推。
#include<bits/stdc++.h>
using namespace std;
struct dice{
int Top;
int Front;
int Right;
};
dice arr[105];
int n,m;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
arr[i] = {1,4,2};
}
for(int i=1,a,b;i<=m;i++){
cin>>a>>b;
if(b==-1){
arr[a].Front = 7 - arr[a].Front;
swap(arr[a].Front,arr[a].Top);
}
else if(b==-2){
arr[a].Right = 7 - arr[a].Right;
swap(arr[a].Top,arr[a].Right);
}
else{
swap(arr[a],arr[b]);
}
}
for(int i=1;i<=n;i++){
cout<<arr[i].Top<<" \n"[i==n];
}
}
//Suifeng0214
//APCS 20200704 pB
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAX = 110;
int arr[MAX][10]; //arr[第幾顆骰子][第幾面]
signed main(){
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= 6; j++){
arr[i][j] = j;
}
}
for (int i = 0; i < m; i++){
int a, b;
cin >> a >> b;
if (b == -1){
int tmp = arr[a][4];
arr[a][4] = arr[a][1];
arr[a][1] = arr[a][3];
arr[a][3] = arr[a][6];
arr[a][6] = tmp;
}else if (b == -2){
int tmp = arr[a][6];
arr[a][6] = arr[a][2];
arr[a][2] = arr[a][1];
arr[a][1] = arr[a][5];
arr[a][5] = tmp;
}else{
swap(arr[a], arr[b]);
}
}
for (int i = 1; i <= n; i++){
cout << arr[i][1]; //輸出朝上的位置><
if (i!=n)cout << " ";
}
}
環狀迷宮有
玩家初始位置在房間
第
逃脫迷宮方法:依序蒐集
每次兌換完,手中的點數就會全部被清空,為了盡快逃出,玩家只要點數夠,就會馬上兌換鑰匙。
最後玩家蒐集完鑰匙後,會停在哪個房間?
Sample Input
7 3 2 1 5 3 4 5 4 8 9 12
Sample Output
3
解釋:
走過
走過
走過
最後停在
分數 | 限制 |
---|---|
20% | |
80% | 無特殊限制 |
先假設本題是在一個正常序列上,要怎麼去做呢?
題目要求的是找到最小的 x 使得
我們可以令前綴和
那麼在環狀序列上,該如何做呢?
可以發現,若將原序列複製一次,也就是令
且由於題目保證鑰匙點數小於所有房間點數和,
複雜度:
//by 8e7
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
int main() {
int n, m;
cin >> n >> m;
ll room[n], key[m], pref[2 * n];
for (int i = 0;i < n;i++) cin >> room[i], pref[i] = pref[i + n] = room[i];
for (int i = 0;i < m;i++) cin >> key[i];
for (int i = 1;i < 2 * n;i++) {
pref[i] += pref[i - 1];
}
int ind = 0;
for (int i = 0;i < m;i++) {
ll left = ind ? pref[ind - 1] : 0;
ind = (lower_bound(pref, pref + 2 * n, left + key[i]) - pref) + 1;
ind %= n;
}
cout << ind << endl;
}
有
每條的輸入格式為下:
( 自身編號 , 親代編號 , RNA 序列 )
若自身編號等於親代編號則是根源。
其中自身編號為
RNA 序列為由 A、U、C、G、@ 組成的字串。@ 為未知的字元,可任意為 A、U、C、G 其中一種。
求所有的親代和子代最小的差距總和。
Sample Input 1
2 3
1 1 AAC
2 1 A@@
Sample Output 1
0
Sample Input 2
6 1
1 1 @
2 1 @
3 1 C
4 1 C
5 2 A
6 2 A
Sample Output 2
1
分數 | 限制 |
---|---|
20 % | 無任何 @ 字元,且對於每個非根源節點 |
40 % | 對於每個非根源節點 |
40 % | 無特別限制 |
首先觀察到,每個位置的字元互不相干,因此我們只需要解決長度 = 1 的問題 m 次就好了。
再來,對於一個點的各個子節點所形成的子樹,他們的答案互不相關。也就是說,假設
那要儲存什麼值呢?先以遞迴方式取得
設
轉移式如下:
複雜度:
可進一步儲存每個點以任意鹼基的最小值
//by emanlaicepsa
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define fi first
#define se second
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define pb push_back
#define all(n) (n).begin(),(n).end()
using namespace std;
vector<int> E[1005];
string s[1005];
string ord = "AUCG";
ll dp[1005][4],n,m;
void dfs(int x,int c){
for(auto &i:E[x]) dfs(i,c);
for(int i=0;i<4;i++){
if(s[x][c] != '@' && s[x][c] != ord[i]){
dp[x][i] = 1e9;
continue;
}
for(auto &j:E[x]){
ll mn = 1e9;
for(int k=0;k<4;k++){
mn = min(mn,dp[j][k] + (k!=i));
}
dp[x][i] += mn;
}
}
}
signed main(){
IOS;
cin>>n>>m;
for(int i=1,a,b;i<=n;i++){
cin>>a>>b;
cin>>s[a];
if(a!=b)E[b].pb(a);
}
ll ans = 0;
for(int i=0;i<m;i++){
memset(dp,0,sizeof(dp));
dfs(1,i);
ans += *min_element(dp[1],dp[1]+4);
}
cout<<ans<<'\n';
}
//by emanlaicepsa
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define fi first
#define se second
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define pb push_back
#define all(n) (n).begin(),(n).end()
using namespace std;
vector<int> E[1005];
string s[1005];
string ord = "AUCG";
ll dp[1005][4],n,m;
ll dp2[1005];
void dfs(int x,int c){
for(auto &i:E[x]) dfs(i,c);
for(int i=0;i<4;i++){
if(s[x][c] != '@' && s[x][c] != ord[i]){
dp[x][i] = 1e9;
continue;
}
for(auto &j:E[x]){
dp[x][i] += min(dp2[j]+1,dp[j][i]);
}
}
dp2[x] = *min_element(dp[x],dp[x]+4);
}
signed main(){
IOS;
cin>>n>>m;
for(int i=1,a,b;i<=n;i++){
cin>>a>>b;
cin>>s[a];
if(a!=b)E[b].pb(a);
}
ll ans = 0;
for(int i=0;i<m;i++){
memset(dp,0,sizeof(dp));
memset(dp2,0,sizeof(dp2));
dfs(1,i);
ans += *min_element(dp[1],dp[1]+4);
}
cout<<ans<<'\n';
}