A题
1.新添加一间酒店,要求酒店离已有的最近的一间酒店的距离恰好等于d
2.最左和最右必定存在合适的两种情况
3.酒店之间的情况就要判断两间酒店间的距离:
小于2d,表示无法在这两间酒店中间找到合适情况
等于2d,表示这两间酒店的正中间可以满足条件,新建酒店
大于2d,表示这两间酒店之间存在两种满足条件的情况
1 #include<bits/stdc++.h> 2 3 /* 4 5 -6 0 5 6 12 13 19 6 7 2 6 10 13 16 21 8 */ 9 using namespace std; 10 #define int long long 11 #define N 209 12 map<int,int> mp; 13 int arr[N]; 14 signed main(){ 15 int n,d; 16 cin>>n>>d; 17 for(int i=1;i<=n;i++) 18 { 19 cin>>arr[i]; 20 mp[arr[i]]=1; 21 } 22 if(n==1){ 23 cout<<2; 24 return 0; 25 } 26 sort(arr+1,arr+1+n); 27 int sum=0; 28 for(int i=1;i<=n;i++){ 29 if(i==1){ 30 if(!mp[arr[i]+d]&&(arr[i+1]-(arr[i]+d))>=d){ 31 mp[arr[i]+d]=1; 32 // cout<<arr[i]+d<<endl; 33 sum++; 34 } 35 continue; 36 } 37 if(i==n){ 38 if(!mp[arr[i]-d]&&(arr[i]-d-arr[i-1])>=d){ 39 mp[arr[i]-d]=1; 40 // cout<<arr[i]-d<<endl; 41 sum++; 42 } 43 continue; 44 } 45 if(!mp[arr[i]-d]&&(arr[i]-d-arr[i-1])>=d){ 46 mp[arr[i]-d]=1; 47 // cout<<arr[i]-d<<endl; 48 sum++; 49 } 50 if(!mp[arr[i]+d]&&(arr[i+1]-(arr[i]+d))>=d){ 51 mp[arr[i]+d]=1; 52 // cout<<arr[i]+d<<endl; 53 sum++; 54 } 55 } 56 printf("%d ",sum+2); 57 return 0; 58 } 59 60 /* 61 3 2 62 4 4 63 5 6 64 6 9 65 */ 66 67 */
B题
题意:有一排n个格子,每个格子里能放一种花,一共有两种花,一种用 0 代表,另一种用 1 代表,然后给你m各区间,每个区间的价值就是这个区间内的两种花的数量之积。问你应该怎么放花,使得这些区间的价值和最大。
思路:就是说让0 1 的个数在各个区间内都是接近的(和相等,越接近,积越大),也就是说0 1 分布均匀,那么,我们直接0 1 交替输出,就可以保证0 1 在各个区间都是最接近的。
AC代码:
#include<bits/stdc++.h> using namespace std; #define N 200505 struct str{ int l,r; int cha; }st[N]; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++){ cin>>st[i].l>>st[i].r; } for(int i=1;i<=n;i++){ if(i%2) cout<<1; else cout<<0; } return 0; } /* 2 1 3 2 4 4 5 6 6 9 101010 2+4+2 101010 1+4+2 */ /**/
C题:
题意:给出一个长为n的数列(数字可以重复),表示在i号位置的数字为ai。.现在,在数列的最左和最右端有一个报数机器人,最左端的机器人向右移动,最右端的机器人向左移动,每移动到一个位置时,机器人就会将这个位置的数字报出来。现在,每个机器人都有一个编号,如果机器人报出来的数字和这个编号相同的话,机器人就会停止移动。 问,这两个机器人的编号有多少种情况,可以使这两个机器人不发生碰撞。
思路:跑后缀就行。用MAP标记超时了QAQ
AC代码:
1 #include<map> 2 #include<stdio.h> 3 #include<iostream> 4 #include<algorithm> 5 6 using namespace std; 7 8 #define int long long 9 #define N 250000 10 int arr[N]; 11 int sum[N]; 12 int mp[N]; 13 int mmp[N]; 14 signed main(){ 15 int n; 16 cin>>n; 17 for(int i=1;i<=n;i++) 18 scanf("%lld",&arr[i]); 19 int add=0; 20 21 for(int i=n;i>=1;i--){ 22 sum[i]=add; 23 if(!mmp[arr[i]]) 24 add++; 25 mmp[arr[i]]=1; 26 } 27 int ans=0; 28 for(int i=1;i<=n;i++){ 29 if(mp[arr[i]]) 30 continue; 31 ans+=sum[i]; 32 mp[arr[i]]=1; 33 } 34 cout<<ans; 35 return 0; 36 }