cf 870div2 abcd题解
A题,先假设一个res从0开始,判断说谎人的个数用ans表示,如果res==ans则假设成立
#include<iostream> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef pair<int,int> PII; const ll INF=0x3f3f3f3f; const int N=1e4+10; int h[N]; ll res; void solve() { int n; cin>>n; int res=0; int f=0; for(int i=0;i<n;i++) cin>>h[i]; while(res<n) { int ans=0; for(int i=0;i<n;i++) { if(res<h[i]) ans++; } if(res==ans) { cout<<res<<endl; return; } res++; //cout<<res<<' '; } //if(res==n) cout<<-1<<endl; }
B题,ai%x=a(n+1-i)%x等价于(ai-a(n+1-i))%X=0(同余定理)即差是x的倍数,0%任何数等于任何数,因为求最大的x即遍历所有的满足gcd
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef double db; typedef pair<int,int> PII; const ll INF=0x3f3f3f3f; const int N=1e5+10; ll h[N]; void solve() { int n; cin>>n; ll res=0; for(int i=1;i<=n;i++) cin>>h[i]; for(int i=1;i<=n;i++) { res=__gcd(res,abs(h[i]-h[n+1-i])); } cout<<res<<endl; }
C题分情况讨论,最后在n>m时发现,只要n的最小质因子大于m时无论如何分都可以,其他都不行(注意找最小值因子的写法)
void solve() { int n,m; cin>>n>>m; if(m==1||n==1) { cout<<"yes"<<endl; } else if(n<=m) { cout<<"no"<<endl; } else { for(int i=2;i<=m&&i<=n/i;i++) { if(n%i==0) { cout<<"no"<<endl; return; } } cout<<"yes"<<endl; } }
D题,转化为b1+l,b2,b3-r即分别求各项的最大值,三元方程一般从中间下手,前后两项都和i有关,可以先求出前后缀最大值,最后从中间b2入手
(注意后缀从后面入手,因为是递推的)
1 void solve() 2 { 3 int n; 4 cin>>n; 5 ll res=-1e6; 6 for(int i=1;i<=n;i++) cin>>a[i]; 7 for(int i=1;i<=n;i++) y[i]=a[i]+i; 8 for(int i=n;i>=1;i--) s[i]=a[i]-i; 9 for(int i=1;i<=n;i++) y[i]=max(y[i-1],y[i]); 10 for(int i=n-1;i>=1;i--) s[i]=max(s[i+1],s[i]); 11 for(int i=2;i<=n-1;i++) 12 res=max(res,a[i]+y[i-1]+s[i+1]); 13 cout<<res<<endl; 14 }
本文作者:zouyua
本文链接:https://www.cnblogs.com/ZouYua/p/17396502.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步