2015國慶第一場 四川省賽練習

2021-07-05 13:40:37 字數 3599 閱讀 7992

這場比賽賽後反應坑點很多,比如資料太弱,比如各種坑。。。。然而對自己的練習價值還是很大的

先分析每個題,再來分析比賽

a:水題:每個開根號判斷就好了

int main()

if (flag) puts("yes");

else puts("no");

} return 0;

}

b:題意:定義進製,問n個數,兩兩相加之後共會有多少個進製總數

腦洞數學題,拿個數舉例子的話,68823:

要找尾數3的進製,要找其他數的個位大於等於7的

要找尾數23的進製,要找其他數的個位大於等於77的

要找尾數823的進製,要找其他數的個位大於等於177的

要找尾數8823的進製,要找其他數的個位大於等於1177的

要找尾數68823的進製,要找其他數的個位大於等於31177的

現在的思路已經有了,把每個數的尾數全部截出來,然後跟其他的數的同樣長度的尾數進行比較,看看能不能進製。。

但是這樣的時間是o(n^2)的

但是,我們用最簡單的辦法減小複雜度!~二分!

所以,最終的方法為,每個數擷取同樣長度的數字,各個數字單獨從小到大查詢自己所需要的「補數」,如823找大於等於177的(但是有個細節,找的時候可能會找到「自己」,待會處理),然後累加即可

上**:(處理點為  ans  - -  的**)

vectorg[20];

int x[maxn];

inline void in(int &x)

}int main()

} for(int i=1;i<=9;i++) sort(g[i].begin(),g[i].end());

ll ans=0;

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

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

} return 0;

}

c題:字串,給定a和b串,要求在b串中找到a串第一次出現的位置然後刪除,將其未刪除的左右兩部分合併之後繼續操作,問最後還剩下哪些字元

這個演算法的精髓就是next陣列,因為在暴力操作中一旦匹配失敗是退回到初始位置繼續,而next陣列的處理之後能夠退回到「」最有可能"再次匹配的地方(利用之前所有的匹配資訊),弄懂了這一點,這個題就好做

然後,很明顯,需要kmp_pre處理a串,然後把b串中的匹配字串刪除,未匹配的存在乙個新的字串中,仍然維護b在a中的next陣列

**如下(特別簡潔):其中pos陣列仍然代表失去匹配之後下個位置去哪兒找

void kmp_pre(char x,int m,int next)

} return i;

}char pat[n],src[n];

int main()

return 0;

}

d題:最小點覆蓋

弱用二分圖匹配水過,,,然而並不能正確的,但是弱弱在這貼個板子

int un,vn;

int g[maxn][maxn];

int linker[maxn];

bool used[maxn];

bool dfs(int u)

} return false;

}int hungary()

return res;

}int main()

un=vn=n;

printf("%d\n",hungary()/2);

} return 0;

}

vectoradjs[maxn];

int last[510];

bool mat[maxn][maxn], vis[maxn];

int n, m;

int res;

bool mustselect(int u)

void dfs(int u, int c) else

dfs(u + 1, c + t);

foreach(it, adjs[u]) if(last[*it] == u)

last[*it] = -1;}}

}int solve()

int main()

n = min(n, 30);

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

}return 0;

}

e題:完美數學題

首先可知,乙個任意的長為x寬為y的矩形,如果可以放入n*m的矩形中,那麼方案數為(n-x+1)(m-y+1)

現在開始分析:由於對稱性,簡化細節,保證n大於等於m(如果n那麼,對x和y的限制有三條,x小於等於n,y小於等於m,2(x+y)小於等於k,可知取min()

由於n和m的範圍限制,我們可以列舉一維再做考慮,不妨列舉x

則有x的範圍為1到min(n,k/2)

那麼y的範圍是1到min(k/2-x,m)

迴圈中不能對y迴圈,但是,發現!!y是從1開始連續的,把公式拆成(n-x+1)(m+1)-y(n-x+1)

y的變化是知道的!所以只需列舉x即可,y得到最大值就可以算出上述的值

int main()

void modify(int x,int val)

}int query(int x)

return res;

}void init(int n)

} memset(tree,0,sizeof(tree));

rmax[n+1]=0;

for(int i=n;i>0;i--) }}

int solve()

void add_edge(int u, int v)

int dis[maxv];

int solvea() }}

return dis[n];

}int cnt[maxv];

int solveb() }}

d += b;

if(viscnt == upper) break;

}return dis[n];

}int main()

if(a < b) printf("%d\n", solvea());

if(a == b) printf("%d\n", a);

if(a > b) printf("%d\n", solveb());

}}

(雖然比賽的時候各種水的姿勢都能過。。。然而,賽後學到方法為好)

j題:暴力列舉題

從(0,0)開始,根據題意,暴力找石頭看看會不會撞到,如果會,找乙個最近的提前轉彎

注意細節點:(1)最大值不夠大,在比較點的時候會wa(2)4種方向的最大最小不同,而且求最近

struct node

node[2000];

int main()

}if(t!=0) now.x=node[t].x-1;

} if(now.tow==1)

}if(t!=0) now.y=node[t].y-1;

} if(t==0){

cout<

今天,中國籃球又讓我找到了自己的興奮點!明天加油!

省賽選拔賽 個人賽第一場

rank 6,一共ac了6題,其中5道1y。感覺這場比賽打得還可以,能出的題都出了,就是一開始選題出現了問題,先去做了dp,導致很多水題出的晚了,時間上佔了劣勢,好在前5道題ac的題都是1y,沒有很多罰時。ac6題之後,看其他題都沒什麼思路,與學長們在知識儲量上的劣勢馬上表現出來了,學長們繼續打 出...

XDU 2017省賽選拔第一場

因為校賽很炸只過了3題,然後組隊參加省賽選拔的要求是大1隊存在4題或以上,大2隊存在5題或以上,所以自己並沒有組隊權,所以必須抱大腿了 打完的當天晚上就去和體育部的老鐵們聚餐去了,心情比較低迷吧,然後組隊什麼的沒去理。然後晚上問了幾個人發現原來已經組好隊的,這讓我內心很絕望。然後就拉了體育部乙個不打...

2015寒假集訓周賽第一場 F 題

description 還記得gardon給小希布置的那個作業麼?上次比賽的1005 其實小希已經找回了原來的那張數表,現在她想確認一下她的答案是否正確,但是整個的答案是很龐大的表,小希只想讓你把答案中最大的m個數告訴她就可以了。給定乙個包含n n 3000 個正整數的序列,每個數不超過5000,對...