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 }