牛客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 }

 

posted @ 2024-02-17 19:13  伊芙加登  阅读(22)  评论(0编辑  收藏  举报