A. Satisfying Constraints
题意:
求大于等于 x x x,小于等于 y y y,且不等于 z z z这个区间的个数。
思路
记录最大的 x x x,最小的 y y y,求出大于等于 x x x且小于等于 y y y的 z z z的个数 t e m p temp temp,答案就是 y − x − t e m p + 1 y-x-temp+1 y−x−temp+1
代码
#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int N=1010;
int st[N];
int t;
void solve(){
int temp=0;
int sum=0;
int ans=0;
int n;
cin>>n;
memset(st,false,sizeof(st));
int mn=-0x3f3f3f3f;
int mx=0x3f3f3f3f;
while(n--){
int a,b;
cin>>a>>b;
if(a==1) mn=max(mn,b);
else if(a==2) mx=min(mx,b);
else if(a==3) st[temp++]=b;
}
for(int i=0;i<temp;i++) if(st[i]>=mn&&st[i]<=mx) sum++;
if(mn>mx) cout<<"0"<<endl;
else cout<<mx-mn+1-sum<<endl;
}
signed main(){
cin>>t;
while(t--)
solve();
return 0;
}
B. Summation Game
题意:
Alice和Bob在玩一个游戏,给出一个数组Alice可以选择小于等于k个元素删除,Bob可选择小于等于x个元素乘于-1,Alice先进行操作,Alice希望最后的数组之和最大,Bob希望数组之和最小,假设双方都以最佳方式进行游戏,请找出游戏结束后数组元素的总和。
题解:
因为Bob希望最小,所以Bob会选择当前数组的x个最大值乘-1,所以如果Alice会选择最大的值进行删除,所以Alice要么不删除,要么选最大的删除,Bob只会选择最大的乘-1;结论:Alice会选择小于等于k个数删除,Bob一定会选择x个数乘-1。所以只需要枚举删除个数的取值。
代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2e5+10;
int a[N];
int t;
bool cmp(int x,int y){
return x>y;
}
void solve(){
int n,k,x;
memset(a,0,sizeof(a));
cin>>n>>k>>x;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++) a[i]+=a[i-1];
int ans=-0x3f3f3f3f;
for(int i=0;i<=k;i++){
ans=max(ans,a[n]-2*a[min(n,i+x)]+a[i]);
}
cout<<ans<<endl;
}
int main(){
cin>>t;
while(t--) solve();
return 0;
}
C. Partitioning the Array
题意:
将数组分成长度相等的子数组,若存在m使得每个子数组的对应元素对m取余后相等,则alice得到一分,输出alice最终得到的分数
思路:
因为对应元素对m取余后对应相等,所以对应元素的差值等于k倍的m(k为整数),所以所有元素对应的差值的最大公约数即为m,当m不等于1时则分数加一
代码:
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2e5+10;
int a[N];
int t;
void solve(){
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int k=1;k<=n;k++){
if(n%k==0){
int temp=0;
for(int i=1;i+k<=n;i++){
temp=__gcd(temp,abs(a[i+k]-a[i]));
}
if(temp!=1) ans++;
}
}
cout<<ans<<endl;
}
int main(){
cin>>t;
while(t--) solve();
return 0;
}