2018暑期集訓選拔考試題解

2021-08-21 23:50:45 字數 4069 閱讀 5649

前幾天把上次考試的題補得差不多了。差最後一題,貌似加上離散化後把原題寫炸了,始終沒有a掉。等集訓一段時間在回頭看這題吧。

正好暑期集訓即將開始,感覺已經在家鹹魚了乙個星期,再不做題怕是要爆零了。。。

8月5日更新:最後一題已經ac了~,又幹了3個小時。。。

a題(智慧型停車場)(xdoj1334)

模擬,可以按車輛到達時間排個序,然後對於每輛車,直接照車位就可以了。

**:

#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef struct

car;

car p[1010];

car st[10100];

bool cmp1(car x,car y)

}p[i].w=ind;

st[ind].e=p[i].e;

}sort(p+1,p+n+1,cmp2);

printf("%d",p[1].w);

for(int i=2;i<=n;i++)

printf(" %d",p[i].w);

return 0;

}

b題(珂朵莉,威廉和第七獸)(xdoj1327)

直接暴搜,簽到題。

**:

#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

char maze[55][55];

int mp[55][55];

int vis[55][55];

int c1,c2,c3,c4=0;

int dx[4]=;

int dy[4]=;

int n,m;

void dfs(int x,int y,int num)

}}int main()

for(int i=1;i<=n;i++)

while(scanf("%d",&n)!=eof)

sort(a+1,a+1+n);

int cnt;

for(int i=1;i<=n;i++)

if(cnt==2)

}if(f==1)

}if(f==0)

if(cnt==1)

}if(f==1)

break;}}

if(f==0)

} return 0;

}

e題( 珂朵莉、威廉和第十一獸 )

這道題直接bfs即可,不過需要注意一些特殊情況,特判一下。

**:

#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef struct

p;int mp[110][110];

int vis[110][110];

int dx[4]=;

int dy[4]=;

char mmp[110][110];

int n,m,t,tx,ty,fx,fy;

int bfs()

} }return -1;

}int main()

for(int i=1;i<=n;i++)

for(int j=2;j<=2*n;j++)

else if(n==1)

else if(n==2)

else

else if(n%4==1)

else if(n%4==2)

else}}

return 0;

}

i題(區間第k大)(xdoj1336)

最開始想寫二分+bit,t掉了,而且也有些複雜。後來發現這道題滿足區間遞增性,用二分加尺取,直接過了。

大致思路就是每次二分時看比這個區間嚴格大的有多少個,如果這個數比k小就更新答案,不斷逼近答案,最後得出解。

**:

#includeusing namespace std;  

typedef long long ll;

ll tem[100005];

ll sum[100005];

int n,k;

ll cal(ll mid)

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

return 0;

}

j題  火聚聚鋪地毯(xdoj1324)

這道題可以說是poj3171和poj2528的乙個結合版,難度加大了不少,在上次比賽中出現在最後一題的位置(不過有幾位聚聚做出來了,膜)。首先總體上dp的思路是好想的,可以設dp[i]為到 i 位置的最小花費,易得dp[i]=min(dp[j])+c[i].w;(a[i].l-1<=j<=a[i].r)。可是這麼算複雜度是o(n^2),要超時的。因為是區間查詢最值問題,想到線段樹。用minv陣列維護dp陣列,每次查詢之前區間的最小值為log(sum),sum為地毯總長度,不過這道題sum過大,線段樹存不下,考慮離散化。這道題還需要考慮相鄰兩個點之間離散化後若相鄰,需判斷原來兩個點是否直接相鄰,若不,再中間加乙個點(詳見**)。此時sum最高為400000左右,總複雜度nlog(sum), 剛剛好。

**:

#include #include #include using namespace std;

#define lson l , m , rt << 1

#define rson m + 1 , r , rt << 1 | 1

typedef long long ll;

const int maxn = 400010;

int min[maxn<<2];

void pushup(int rt)

typedef struct

cloth;

cloth c[100010];

cloth ccopy[100010];

ll lisan[400040];

bool cmp(cloth x,cloth y)

void update(int p,int sc,int l,int r,int rt)

int m = (l + r) >> 1;

if (p <= m) update(p , sc , lson);

else update(p , sc , rson);

pushup(rt);

}int query(int l,int r,int l,int r,int rt)

int m = (l + r) >> 1;

int ret = 2e9;

if (l <= m) ret = min(ret , query(l , r , lson));

if (r > m) ret = min(ret , query(l , r , rson));

return ret;

}int main()

}sort(lisan,lisan+num);

ll mm = lower_bound(lisan,lisan+num,m)-lisan;

mm++;

ll ee = lower_bound(lisan,lisan+num,e)-lisan;

ee++;

for(int i=0;icur+1)

int tem=query(c[i].li-1,c[i].ri,mm-1,ee,1);

update(c[i].ri,tem+c[i].w,mm-1,ee,1);

cur=max(cur,ccopy[i].ri);

}if(e > cur)

if(flag)

printf("%d\n",query(ee,ee,mm-1,ee,1));

else

printf("-1\n");

return 0;

}

考試題題解

主講人igl albl 試題t2 t3 t1 t4 t5 暴力 dfs所有路徑,在使用clock的情況下預計 text 題意 給你一張有向圖,距離為 text 的正整數次冪的兩點間可以重新連一條長為 text 邊,求在此情況下的從起點到終點最短路。我們用 text 表示點 text 到點 text ...

考試題解集合

某天忽然發現自己的blog裡全是考試題解 那麼為什麼不鏈到一篇blog裡呢?避免首頁全是加密blog看起來不大友善,大概也會整齊一點。估計是個大工程但還是作死地開始啦。有些難題是單獨寫的,就不鏈了。密碼仍然是開機使用者名稱 入學年份 兩個班級,希望總是能比過去的自己更用心!2018 4月 14 17...

2020 11 25 考試題解

題目描述 有一圈數,其數目為n個,定義一次操作為每個數變為原數圈中的自己與相鄰的兩個數這三個數的異或和,給出原陣列和操作次數,請算出最後的結果陣列。輸入資料 輸入第一行包含兩個正整數n和k,分別表示陣列數目和操作次數。第二行 n 個整數。輸出資料 僅包含一行n個整數。樣例輸入 3 1 1 2 3樣例...