開學第一週週報

niubuniu發表於2024-03-10

這個星期是開學的第一週,進行了天梯賽的選拔,兩場比賽打的都不好。賽後反思了一下,感覺自己有點陷入演算法的框架中了。現在無論做什麼題第一時間就想往演算法方面去思考,dp,樹狀陣列,搜尋。但是賽後補題的時候發現其實壓根就用不到,大多數都是貪心,但不知道怎麼的比賽過程中就沒有想到去貪心。還是挺難受的,賽後補題的時候真的是追悔莫及,自己為什麼老是想用dp去寫,明明自己根本就不熟悉dp的寫法。賽後反思了很久,感覺自己還沒有寒假前水平高,才發現自己一直陷入了演算法的框架裡,題目大多數用到的演算法並不多,好多都是思維題,真的要改變自己做題的方式。
這一週就是正常的訓練補了習題,又自己找了一些cf上面的題。

這道題做的時候就在化簡那個式子,但是很慘的是化簡畫歪了(a&b)⊕(a∣b)=ab,我是真沒有想到能這樣化簡,化成abcd...,用字首和,再加上abcc=ab,不知道有這個轉化方法,想了很久都沒做出來。。。賽後補題知道化簡後是a^b後很快就寫出來了

include <bits.stdc++.h>

define int long long

using namespace std;
int s[200005];
signed main()
{
int n;
cin>>n;
cin>>s[1];
for(int i=2;i<=n;i++)
cin>>s[i],s[i]=s[i]^s[i-1];
int m;
cin>>m;
while(m--){
int l,r;
cin>>l>>r;
cout<<(s[r]^s[l-1])<<'\n';
}
return 0;
}
20行程式碼啊!!!!我居然化簡了很久都沒有化成

這道題感覺真的是巧妙,用一個二維陣列去儲存奇偶性和各位數之和,然後用ans儲存,遍歷兩次一次是左半部分大於右半部分,一次是右半部分大於左半部分。

include <bits/stdc++.h>

define int long long

using namespace std;
int n;
int sum[200005];
int num[2000][3];
string s[200005];
int get(int x){
int ans=0;
while(x!=0){
ans+=x%10;
x/=10;
}
return ans;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i];
for(int i=1;i<=n;i++){
sum[i]=get(stoi(s[i]));
num[sum[i]][s[i].size()%2]++;
}
int ans=0;
for(int i=1;i<=n;i++){
int l=0;
for(int j=0;j<s[i].size();j++){
l+=s[i][j]-'0';
int r=sum[i]-l;
if(l>r){
ans+=num[l-r][s[i].size()%2];
}
}
}
for(int i=1;i<=n;i++){
int l=0;
for(int j=0;j<s[i].size();j++){
l+=s[i][j]-'0';
int r=sum[i]-l;
if(l<r){
ans+=num[r-l][s[i].size()%2];
}
}
}
cout<<ans;
return 0;
}

這道題雖然是個簡單題但是讀題讀了很久才弄懂,題目搞懂後還是很簡單的。就是用一個變數記錄路徑長度然後 int num=(15-m)*2+1;,用路徑長度去除這個num就行,其實就是判斷紅石源能照耀多少範圍。

include

include "vector"

include

include "cmath"

include "algorithm"

define int long long

using namespace std;
int s[10005][3];
signed main()
{
int n,m;
cin>>n>>m;
int ans=1;
for(int i=1;i<=n;i++){
cin>>s[i][1]>>s[i][2];
}
for(int i=2;i<=n;i++){
ans+=abs(s[i][1]-s[i-1][1])+abs(s[i][2]-s[i-1][2]);
}
if(m0){
cout<<"0";
return 0;
}
int num=(15-m)*2+1;
if(ans%num
0){
cout<<ans/num;
}
else
cout<<ans/num+1;
return 0;
}
奶茶袋收集和金字塔一個是貪心,一個是純模擬。
補的時候比較輕鬆,居然在比賽中沒有做出來