# 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;
}
```