---
# System prepended metadata

title: ' # 112-2 程式設計(二) Week03參考解答'

---

# week 3
## The_Burden_Of_Love
### 解題思路
利用前綴和紀錄資訊，，O(n) 跑一次即可以便之後能快速以 O(1) 的時間查詢某個區間內的數字總和
接著利用二分搜 "猜" 哪個答案是最好的
共有 q 個 query，每輪花費 O(logn) 的時間，故總時間複雜度為 O(q*logn)
### AC 程式
```c
#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n);

    int a[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d", &a[i]);
    }

    int prefix[n+1];
    prefix[0]=0;
    for(int i=1;i<=n;i++)
    {
        prefix[i]=prefix[i-1]+a[i-1];
    }

    int q;
    scanf("%d", &q);
    for(int i=0;i<q;i++)
    {
        int t, m;
        scanf("%d%d", &t, &m);

        int left=t, right=n-1, mid;
        int ans=0;
        while(1)
        {
            mid=(left+right)/2;

            if(m>=prefix[mid+1]-prefix[t])
            {
                if(mid-t+1>ans) ans=mid-t+1;
            }
            if(left==right) break;
            if(m>=prefix[mid+1]-prefix[t]) left=mid+1;
            else right=mid;
        }

        printf("%d\n", ans);
    }

    return 0;
}
```
## The_Dintance_Of_Love
### 解題思路
使用遞迴搭配 for 迴圈，暴力列舉出所有可能的 permutation 即可
時間複雜度 O(N!)
### AC 程式
```c
#include <stdio.h>

int counter=0;
int n, k;
void f(int* a,int* used, int now_index)
{
    if(now_index>=n)
    {
        int reverse_count=0;
        for(int i=0;i<n-1;i++)
        {
            if(a[i]>a[i+1]) reverse_count++;
        }

        if(reverse_count<=k) counter++;

        return;
    }

    for(int i=0;i<n;i++)
    {
        if(used[i]==0)
        {
            used[i]=1;
            a[now_index]=i+1;
            f(a, used, now_index+1);
            used[i]=0;
        }
    }
}
int main()
{
    scanf("%d %d", &n, &k);

    int used[n];
    int a[n];
    for(int i=0;i<n;i++)
    {
        used[i]=0;
    }

    f(a, used, 0);

    printf("%d\n", counter);

    return 0;
}
```
## The_Trial
### 解題思路
利用DFS遞迴進行地圖遍歷，確認是否可以到達終點（熒的位置）。
### AC 程式
```c=
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

int direct[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
int check = 0;

bool is_road(int **map,int x,int y,int length,int width){
    if( x == length || x < 0 || y < 0 || y == width ||map[y][x] == 1)   return false;
    return true;
}

void dfs(int **map,int length,int width,int x_src,int y_src,int x_dst,int y_dst){
    if(x_src == x_dst && y_src == y_dst){
        check = 1;
    }
    map[y_src][x_src] = 1;
    for(int i = 0 ; i < 4 ; i++){
        int new_x = x_src + direct[i][1];
        int new_y = y_src + direct[i][0];
        if(is_road(map,new_x,new_y,length,width)){
            dfs(map,length,width,new_x,new_y,x_dst,y_dst);
        }
    }
}

int main(){
    int length, width, x_src, y_src, x_dst, y_dst;
    scanf("%d %d",&width,&length);
    scanf("%d %d %d %d", &y_src, &x_src, &y_dst, &x_dst);
    int **map = (int**)malloc(width * sizeof(int*));
    for(int i = 0 ; i < width ; i++){
        map[i] = (int*)malloc(length*sizeof(int));
    }
    for(int i = 0 ; i < width ; i++){
        for(int j = 0 ; j < length ; j++){
            scanf("%d",&map[i][j]);
        }
    }
    dfs(map,length,width,x_src,y_src,x_dst,y_dst);
    if(check == 1){
        printf("Yes\n");
    }
    else{
        printf("No\n");
    }
    return 0;
}
```