CF1909题解
CF1909A
一眼秒之题,我们发现就是四个方向选三个方向,若是存在一个点它的方向恰好在(0,0)点的另外一个方向,则一定不成立
枚举4个方向,发现有点在这个方向,显然选除这个点之外的三个方向的方案就不可行
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int t,n;
int x[N],y[N];
bool c1(){
for(int i=1;i<=n;i++){
if(x[i]<0) return 0;
}
return 1;
}
bool c2(){
for(int i=1;i<=n;i++){
if(x[i]>0) return 0;
}
return 1;
}
bool c3(){
for(int i=1;i<=n;i++){
if(y[i]<0) return 0;
}
return 1;
}
bool c4(){
for(int i=1;i<=n;i++){
if(y[i]>0) return 0;
}
return 1;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&x[i],&y[i]);
}
if(c1()||c2()||c3()||c4()) printf("YES\n");
else printf("NO\n");
}
}
CF1909B
看似普及-,实则封神
我们先想到若这些数有奇数也有偶数k直接等于2即可
然而若不是呢?
判断一个数的奇偶只需要看它的二进制最低位是0/1就行
若一个数列全是奇或偶那么必然二进制第一位上全是1或全是0
但是其必然会出现在二进制的某一位上1/0两种都存在
若一个数模上一个
所以我们只需要找到在二进制表示的数列中,找到最低的一位满足这一位存在0/1即可
这显然可以字典树做,但这道题普及-所以我们暴力枚举
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=105,inf=1e18;
int t,n;
int a[N];
bool check(int mod){
set<int>st;
for(int i=1;i<=n;i++){
int z=a[i]%mod;
st.insert(z);
}
if(st.size()!=2) return 0;
return 1;
}
signed main(){
scanf("%lld",&t);
while(t--){
int ans=inf;
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int j=0;j<=63;j++){
int mod=(1ll<<j);
if(check(mod)){
printf("%lld\n",mod);
break;
}
}
}
}
CF19909C
小恶心贪心题
显然我们是要求出来一个降序序列
考虑如何构造出对应的
我们先将
所以我们只需要让在
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,cnt,t;
int l[N],r[N],c[N],s[N],ans[N];
bool cmp(int x,int y){
return x>y;
}
signed main(){
scanf("%lld",&t);
while(t--){
cnt=0;
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&l[i]);
}
for(int i=1;i<=n;i++){
scanf("%lld",&r[i]);
}
for(int i=1;i<=n;i++){
scanf("%lld",&c[i]);
}
sort(c+1,c+1+n);
sort(l+1,l+1+n);
sort(r+1,r+1+n);
for(int i=1,j=1;i<=n;i++){
while(l[j]<r[i]&&j<=n){
s[++cnt]=l[j];
j++;
}
// printf("%lld %lld\n",r[i],s[cnt]);
ans[i]=r[i]-s[cnt--];
}
sort(ans+1,ans+1+n,cmp);
int tot=0;
for(int i=1;i<=n;i++){
tot+=ans[i]*c[i];
}
printf("%lld\n",tot);
}
}
CF1909D
呵呵,又是一道恶心题
考虑转化一下式子
->
所以我们就将所有的
考虑不管怎么拆分这个序列,这个序列的总和
如何求这个
我们现在证明了
考虑一种拆法,
所以最终我们就是要找到序列
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int t,n,k;
int a[N];
bool check1(){
for(int i=2;i<=n;i++){
if(a[i]!=a[i-1]) return 0;
}
return 1;
}
bool check2(){
if(a[1]==0) return 1;
int z=(a[1]>0);
for(int i=2;i<=n;i++){
if(a[i]==0) return 1;
if((a[i]>0)!=z) return 1;
}
return 0;
}
int gcd(int x,int y){
if(!y) return x;
return gcd(y,x%y);
}
signed main(){
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
a[i]-=k;
}
if(check1()){
printf("0\n");
continue;
}
if(check2()){
printf("-1\n");
continue;
}
int num=0,tot=0;
tot+=a[1];
num=a[1];
for(int i=2;i<=n;i++){
tot+=a[i];
num=gcd(num,a[i]);
}
printf("%lld\n",tot/num-n);
}
}
CF1909E
题解讲的比我好(bushi
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!