acwing----春季每日一题2022篇(一)
春季每日一題第一周題解
- 你知道你的ABC嗎(推理)
- 放養但沒有完全放養(貪心)
- 牛年(模擬)
- 牛的學術圈 I(前綴和 + 技巧)
- 奶牛體操(思維 + 圖論)
你知道你的ABC嗎(推理)
題目鏈接
解題思路:
由于題面已經給出了A,B,C的大小關系。那么對于這幾個數,我們知道A肯定是最小的,A+B+C是最大的,對于B,C的關系,我們假設B與A之間有一個數x,那么這個x要滿足嚴格小于B,但是在剩余的數中我們是找不到滿足條件的,因此,可以推出B是第二小的,那么我們由A + B + C 的值就可以得到C的值。
代碼:
#include<iostream> #include<algorithm> using namespace std; const int N = 10; int a[N]; int n = 7;int main(){for(int i = 0 ; i < n ; ++i)cin>>a[i];sort(a,a+n);for(int i = 0 ; i < 2 ; ++i)cout<<a[i]<<" ";cout<<a[n-1] - a[0] - a[1]<<endl; // 發現也不用找,應為C一定存在,那么直接用A + B + C 的值 減去A 和B的值即可return 0; }放養但沒有完全放養(貪心)
題目鏈接
解題思路:
這就是一個按位匹配,就是他聽到的字母一定是有序(按照牛文)的,如果不是,那么就是新唱了一遍。
那么就是一直匹配就行了。
對于做法,我們庫將聽到的串,每匹配到一個就刪去。那么當字符串長度為0的時候就匹配完全了。
代碼:
#include<iostream> #include<algorithm> #include<string> #include<cstring> using namespace std; const int N = 1010;string str , s;int main(){cin>>str>>s;int cnt = 0;while(1){cnt++;int n = str.size();for(int i = 0 ; i < n ; ++i )if(str[i] == s[0])s.erase(s.begin());if(s.size() == 0) break;}cout<<cnt<<endl;return 0; }牛年(模擬)
題目鏈接
解題思路:
pre 表明這個人在前邊也就距離Bessie 更遠 , next 則是更近。我們對于每一個人存的都是距離Bessie 的距離。
代碼:
#include<iostream> #include<algorithm> #include<string> #include<cmath> #include<map> using namespace std; const int N = 1100000 , INF = 0x3f3f3f3f;map<string,int>st, ans; // ans 是 答案,也就是距離 ,st 是生肖的位置 map<string,string>bk; //記錄人對應的生肖int n ; string str ,a ,b , op ,anl ,bnl; string ss[14] = {"","Ox", "Tiger", "Rabbit", "Dragon", "Snake", "Horse", "Goat", "Monkey", "Rooster", "Dog", "Pig", "Rat"} ;void init(){for(int i = 1 ; i <= 12 ; ++i)st[ss[i]] = i; }int main(){init();cin>>n;ans["Bessie"] = 0 , bk["Bessie"] = "Ox";while(n--){for(int j = 1 ; j <= 8 ; ++j){cin>>str;if(j == 1) a = str; if(j == 8) b = str;if(j == 4) op = str; if(j == 5) anl = str;}bk[a] = anl , bnl = bk[b];if(op == "next"){if(st[anl] > st[bnl]) ans[a] = ans[b] - (st[anl] - st[bnl]);elseans[a] = ans[b] - ( 12 - st[bnl] + st[anl]); }else{ // preif(st[anl] < st[bnl]) ans[a] = ans[b] + (st[bnl] - st[anl]);elseans[a] = ans[b] + ( st[bnl] + 12 - st[anl] ); }}cout<<abs(ans["Elsie"])<<endl;return 0; }牛的學術圈 I(前綴和 + 技巧)
題目鏈接
題目大意
題目是要求一個最大的h,這個h滿足在序列中的值大于等于h的個數至少有h個。同時由L個引用的機會。
解題思路
我們先暫時不管L個引用。對于前一個問題,我們可以對每一個數值用一個數組存下出現的個數。之后對這個數組求前綴和,那么我們就可以0(1)的復雜度,求出序列中值在[L,R]區間內的個數為s[R] - s[L-1].這樣我們就解決了第一個問題。對于第二個問題,如果不限制對同一篇論文的引用次數的話,這題就復雜得多了。但是由于有了限制,那么對于h來說,哪些能通過后面這個引用滿足條件呢,那就是與其差1的值的個數.如果num 小于 h,我們就看min(L,c[h-1]) >= h - num就可以了
- 為什么加min呢,是因為我們要求的需要的個數是,值為h-1個個數中我們能用L次引用提高上來的部分。
代碼:
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N = 1e5 + 10;int n , m; int s[N], a[N] , c[N];int main(){cin>>n>>m;for(int i = 1; i <= n ; ++i){cin>>a[i];c[a[i]]++;}for(int i = 1 ; i < N ; ++i)s[i] = s[i-1] + c[i];int h ;for( h = 1; h ; ++h){int num = s[N-1] - s[h-1];if(num >= h)continue;if(min(m,c[h-1] ) >= h - num)continue;break;}cout<<h-1<<endl;return 0; }奶牛體操(思維 + 圖論)
題目鏈接
解題思路
在這里我們可以抽象,將排名之間的關系看成一條邊。即每一次排名中,如果i在j前邊,那么就建立一條i指向j的邊。那么在所有關系都建立完之后,我們遍歷所有的點對,如果i到j有邊,但j到i沒有邊,那么就說明這么多次排名中j都沒有在i前邊,那么次數加1。
代碼:
#include<iostream> #include<cstring> #include<algorithm> using namespace std;const int N = 110; int in[N] ,a[N]; int n , m; bool st[N][N];int main(){cin>>m>>n;while(m--){for(int i = 1 ; i <= n ; ++i)cin>>a[i];// 建立關系for(int i = 1 ; i <= n ; ++i)for(int j = i + 1 ; j <= n ; ++j)st[a[i]][a[j]] = 1;}int ans = 0;for(int i = 1 ; i <= n ; ++i)for(int j = 1 ; j <= n ; ++j){if(st[i][j] && !st[j][i]) // 由于在建邊的時候沒有建立自己指向自己的所有不用特判ans++ ; //如果i 指向j ,但j沒有指向i,說明在這么多次排名中i都在j前邊}cout<<ans<<endl;return 0; }總結
以上是生活随笔為你收集整理的acwing----春季每日一题2022篇(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PTA团体程序设计天梯赛篇(一)----
- 下一篇: PTA团体程序设计天梯赛篇(四)----