https://codeforces.com/contest/1435/problem/C

题意:
每种音符都可以选择六种琴弦,求每种音符减去琴弦以后,里面的最小差值。
解题思路
把每一个音符的六种琴弦都减去,把所有情况都加进一个PII类型里面,第一位存的音符减去琴弦的值,第二位是存的第几个音符,把所有的情况都存进来,然后排序。
然后用双指针,扫描,找到最小差值。
代码如下:

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int N=1e5+10;
 5 int a[7];
 6 int b[N];
 7 typedef pair<int ,int> PII;
 8 PII p[N*6];
 9 int vis[N];
10 int main()
11 {
12     for(int i=1 ; i<=6 ; i++) cin>>a[i];
13     sort(a+1,a+7);
14     int n;
15     cin>>n;
16     int cnt=0;
17     for(int i=1 ; i<=n ; i++){
18         cin>>b[i];
19         for(int j=1 ; j<=6 ; j++){
20             p[++cnt].first=b[i]-a[j];
21             p[cnt].second=i;
22         }
23     }
24     sort(p+1,p+1+cnt);
25     int pos1=1,pos2=1,num=0;
26     int ans=1e9;
27   //  cout<<vis[8]<<endl;
28     while(pos2<=cnt){
29        // cout<<p[pos2].second<<" "<<vis[p[pos2].second]<<endl;
30         if(vis[p[pos2].second]==0) num++;
31         vis[p[pos2].second]++;
32         while(num==n&&pos1<=pos2&&vis[p[pos1].second]){
33           //  cout<<p[pos2].first-p[pos1].first<<endl;
34             ans=min(ans,p[pos2].first-p[pos1].first);
35             vis[p[pos1].second]--;
36             pos1++;
37             if(vis[p[pos1-1].second]==0) num--;
38         }
39         pos2++;
40     }
41     cout<<ans<<endl;
42     return 0;
43 }
View Code

 

   

posted @ 2020-11-10 21:09  古比  阅读(353)  评论(0编辑  收藏  举报