Educational Codeforces Round 96 (Rated for Div. 2)
生活随笔
收集整理的這篇文章主要介紹了
Educational Codeforces Round 96 (Rated for Div. 2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天先補了上一場的Codeforces Global Round 11三道題,做的心神恍惚,然后17點報名沒敢提交,先寫了4個題剩下的改天補一補
我是真的服信號,卷積卷si我了
A - Number of Apartments
枚舉3和5的個數,直接算出來7的個數即可
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=100010; int main() {IO;int T=1;cin>>T;while(T--){int n;cin>>n;bool ok=0;for(int i=0;i<=n;i++){if(ok) break;for(int j=0;j<=n;j++){int k=n-3*i-5*j;if(k<0||k%7) continue;cout<<i<<' '<<j<<' '<<k/7<<'\n';ok=1;break;}}if(!ok) cout<<-1<<'\n'; }return 0;}B - Barrels
很明顯需要把第2~k+1大的全部導入最大的容器中,然后求個和即是答案
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010; int n,k; int a[N]; int main() {IO;int T=1;cin>>T;while(T--){cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);reverse(a+1,a+1+n);ll res=0;for(int i=1;i<=k;i++) res+=a[i+1];res+=a[1];cout<<res<<'\n';}return 0;}C - Numbers on Whiteboard
貪心:1一定最后再用,然后依次用兩個最大的即可。
總的來說就是每次用兩個最大的。
D - String Deletion
首先掃一遍序列,把相同的分段用一個vector存下來,不難發現我如果當前的一段個數大于1我們只需要兩次操作都在這一段即可,否則只需要在后面的段中選擇一個個數大于1的用操作1即可,簡單模擬。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010; int n,k; char s[N]; int main() {IO;int T=1;cin>>T;while(T--){cin>>n;cin>>s+1;vector<int> now;for(int i=1;i<=n;i++){int j=i+1;while(j<=n&&s[i]==s[j]) j++;now.push_back(j-i);i=j-1;}int res=0;for(int i=0,j=0;i<now.size();i++){if(now[i]>=2){res++;continue;}bool ok=0;j=max(j,i+1);for(;j<now.size();j++){if(now[j]>=2) {now[j]--;ok=1;break;}}if(!ok) i++;res++;}cout<<res<<'\n';}return 0; }E - String Reversal
不難貪心出結論即:每次選擇離自己最近的字母交換
首先可以記下每個字母出現的位置用26個vector即可,用樹狀數組快速求出每次移動需要的代價然后就不難得出答案了。
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010; char s[N],p[N]; int n; queue<int> mp[27]; int tree[N]; int lowbit(int x) {return x&-x; } void update(int k,int x) {for(;k<=n;k+=lowbit(k)) tree[k]+=x; } int query(int k) {int res=0;for(;k;k-=lowbit(k)) res+=tree[k];return res; } int main() {IO;int T=1;//cin>>T;while(T--){cin>>n;cin>>s+1;for(int i=1;i<=n;i++){mp[s[i]-'a'].push(i);update(i,1);}ll res=0;for(int i=n;i;i--)//逆序字符{int pos=mp[s[i]-'a'].front();mp[s[i]-'a'].pop();res+=query(pos)-1;update(pos,-1);}cout<<res<<'\n';}return 0;}我是剛剛做完信號的一題來寫的題解,現在心態非常爆炸。。。
題解質量不想說了真的laji
剩下的題明天補一下吧(明天信號又要自己看書了,老師講的根本聽不懂啊啊啊)
要加喲哦~~
總結
以上是生活随笔為你收集整理的Educational Codeforces Round 96 (Rated for Div. 2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 另分享几个无损音乐下载网站无损音乐批量下
- 下一篇: 迅捷路由器怎么设置无线桥接迅捷路由器FW