对于任意一个b,肯定是某一个裁判打分后的结果。先由此求出所有可能的初始分数,再判断是否满足其它的b值。
1 #include <cstdio> 2 #include <bits/stdc++.h> 3 using namespace std; 4 5 int a[2010],b[2010],sum[2010]; 6 int n,k; 7 set<int> s2,s3; 8 9 int main() 10 { 11 scanf("%d%d",&n,&k); 12 for(int i=1;i<=n;i++) 13 { 14 scanf("%d",&a[i]); 15 sum[i]=sum[i-1]+a[i]; 16 } 17 for(int i=0;i<k;i++) 18 { 19 scanf("%d",&b[i]); 20 } 21 for(int i=1;i<=n;i++) s2.insert(b[0]-sum[i]); 22 int cnt=s2.size(); //!!! 23 set<int>::iterator it2; 24 for(it2=s2.begin();it2!=s2.end();it2++) 25 { 26 s3.clear(); 27 for(int i=1;i<=n;i++) s3.insert(*it2+sum[i]); 28 for(int i=0;i<k;i++) if(!s3.count(b[i])) { 29 cnt--; 30 break; 31 } 32 } 33 printf("%d ",cnt); 34 }
首先要清楚一个事实,选取的钥匙一定是连续的n个钥匙。
然后暴力第一把钥匙,更新最小值。
又被long long 坑了一把。。。
1 #include <cstdio> 2 #include <bits/stdc++.h> 3 using namespace std; 4 #define LL long long 5 const int maxn=1010; 6 int p[maxn],k[maxn<<1]; 7 int n,m,d; 8 9 int main() 10 { 11 scanf("%d%d%d",&n,&m,&d); 12 for(int i=0;i<n;i++) scanf("%d",&p[i]); 13 for(int i=0;i<m;i++) scanf("%d",&k[i]); 14 sort(p,p+n); 15 sort(k,k+m); 16 LL ans=1e18,temp; 17 for(int i=0;i+n-1<m;i++) 18 { 19 temp=0; 20 for(int j=0;j<n;j++) 21 { 22 LL r=abs(p[j]-k[i+j])+abs(k[i+j]-d); 23 temp=temp>r?temp:r; 24 } 25 ans=ans<temp?ans:temp; 26 } 27 printf("%lld ",ans); 28 }