Two progressions(CodeForces-125D)【鸽巢原理】
2024-09-04 21:21:23
题意:将一列数划分为两个等差数列。
思路:首先,我要吹爆鸽巢原理!!!真的很强大的东西!!!
加入能完成题设操作,则前三个数中,必有至少两个数在同一序列,枚举三种情况(a1 a2,a2 a3,a1 a3分别为等差数列的前两项)。
注:枚举情况时,如果操作失败,则将已成功生成的等差数列末项划分到另一个数列试试。(稍作思考即可)
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,arr[],book[]; bool judge(){
int ps,gap;
int t1=,t2;
while(t1<=n&&book[t1]) t1++;
t2=t1+;
if(t1>n)
return false;
while(t2<=n&&book[t2]) t2++;
if(t2>n)
return true;
gap=arr[t2]-arr[t1];
ps=t2;
for(int i=t2+;i<=n;i++)
if(!book[i]){
if(arr[i]-arr[ps]==gap)
ps=i;
else
return false;
}
return true;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&arr[i]);
if(n==)
printf("%d\n%d",arr[],arr[]);
else {
int x[]={arr[]-arr[],arr[]-arr[],arr[]-arr[]};
int flag=;
for(int i=;i<;i++){
int st=,tmp=arr[];
memset(book,,sizeof(book));
if(i==){
book[]=book[]=;
st=;
tmp=arr[];
}
else if(i==)
book[]=book[]=;
else
book[]=book[]=;
for(int ii=st;ii<=n;ii++)
if(arr[ii]==tmp+x[i]){
book[ii]=;
tmp=arr[ii];
}
if(judge()){
flag=;
break;
}
else {
int p=n;
while(!book[p])
p--;
book[p]=;
if(judge()){
flag=;
break;
}
}
}
if(flag){
for(int i=;i<=n;i++)
if(book[i])
printf("%d ",arr[i]);
printf("\n");
for(int i=;i<=n;i++)
if(!book[i])
printf("%d ",arr[i]);
}
else printf("No solution");
}
return ;
}
By xxmlala
最新文章
- JavaScript 智能社 拖拽
- 贪吃蛇的java代码分析(二)
- Java实时读取日志文件
- var和dynamic的区别及如何正确使用dynamic ?
- ubuntu下安装wine1.8和阿里旺旺
- [python]python元类
- C# 杂项
- ServerMediaSession::generateSDPDescription分析
- Inaccurate values for &ldquo;Currently allocated space&rdquo; and &ldquo;Available free space&rdquo; in the Shrink File dialog for TEMPDB only
- SharePoint2013 SharePoint-Hosted 模式 分页方法
- Delphi PChar与String互转
- Ubuntu 14.10安装mentohust
- java中<;T>; T和T的区别
- MySQL:事务的隔离性
- wireshark配合jmeter测试webservice接口
- 【java编程】String拼接效率探究
- docker link 过时不再用了?那容器互联、服务发现怎么办?
- linux系统编程之文件与IO(三):利用lseek()创建空洞文件
- FineUI分组显示弹框最新的在最上边
- java基础---JDK、JRE、JVM的区别和联系