牛客2
1.Tokitsukaze and Eliminate (hard)(easy难度可以通过暴力来进行,但是hard添加了颜色,我们需要从右往左找到最靠左的某一颜色的最后一个,那么我们可以先用map存图,存下当前剩下几种颜色,再用set一遍一遍重复清点颜色数量,一旦和map中颜色相同就消除一次)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n; 6 cin>>n; 7 int m; 8 for(int i=0;i<n;i++) 9 { 10 cin>>m; 11 vector<int> v; 12 map<int,int>mp; 13 for(int j=0;j<m;j++) 14 { 15 int x; 16 cin>>x; 17 v.push_back(x); 18 mp[x]++; 19 } 20 int ans=0; 21 set<int>s; 22 int r=m-1; 23 int d=mp.size(); 24 while(r>=0) 25 { 26 mp[v[r]]--; 27 if(mp[v[r]]==0)mp.erase(v[r]);//此颜色消除完了就从map中删去 28 s.insert(v[r]); 29 if(s.size()==d) 30 { 31 s.clear(); 32 d=mp.size(); 33 ans++; 34 } 35 r--; 36 } 37 cout<<ans<<"\n"; 38 } 39 return 0; 40 }
2.Tokitsukaze and Short Path (minus)(pius和minus其实都是找规律和sort排序,想复杂了)
1 #include <bits/stdc++.h> 2 #define endl '\n' 3 #define int long long 4 using namespace std; 5 const int N = 2e5+10 , M = 1e6+10 ; 6 void solve() { 7 int n; 8 cin >> n; 9 vector<int> k(n+1); 10 int sum=0; 11 for(int i=1;i<=n;i++) cin >> k[i] , sum+=k[i]; 12 sort(k.begin()+1,k.end()); 13 int ans=0 , res=k[1]; 14 for(int i=1;i<=n;i++) { 15 int w = min(res*2,k[i]); 16 ans+=w*(n-i); 17 } 18 cout << ans*4 << endl; 19 } 20 21 signed main() { 22 ios::sync_with_stdio(0); 23 cin.tie(0) , cout.tie(0); 24 int T = 1; 25 cin >> T ; 26 while(T--) solve(); 27 return 0; 28 }