目录
T1 排序2
思路1
代码1
思路2
代码2
T2 拼不出的数
思路
代码1
T3 整除
思路1
代码1
思路2
代码2
T4 交换
思路
代码1
代码2
OICLASS 普及组测试6题目
求最长不下降子序列。观察可以发现如果这个序列最长不下降子序列的长度小于总长度-1,那么就无法通过一次操作排好序。
对于这个数据要用 nlongn 的时间复杂度求出最长不下降子序列,推荐lvmememe的博客
#include
#include
using namespace std;
int a[1000006];
int d[1000006];
int main()
{
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
if(n==0)
{
printf("0\n");
return 0;
}
d[1]=a[1];
int len=1;
for(int i=2;i<=n;i++)
{
if(a[i]>=d[len])d[++len]=a[i];
else
{
int j=lower_bound (d+1,d+len+1,a[i])-d;
d[j]=a[i];
}
}
printf(len+1>=n?"YES":"NO");
return 0;
}
模拟(大暴力)
某dalao的代码
#include
#include
#include
#include
#define N 1000010
using namespace std;
int n,s,a[N];
int main()
{
scanf("%d",&n);
for(int i=0;i=a[i-1]) continue;
s++;
if(a[i-2]>a[i]&&a[i-2]>a[i+1]) {puts("NO"); return 0;}
if(a[i-1]>a[i+1]) a[i]=a[i-2];
else a[i]=a[i-1];
if(s>1){puts("NO"); return 0;}
}
puts("YES");
}
推公式
现从小到大排序,用前缀和sum[i]表示前 个数的和。
通过观察可以发现, 如果 >sum[i-1]则有最小拼不出的数sum[i-1]+1
举个例子帮助理解:
集合[1,2,x]中 , =3,
若x=4,则有最小拼不出的数sum[n]+1=8
若x=5 (样例),5>(+1 ) 所以4无法组合
所以,当x>=5 时,有最小4无法组合。
#include
#include
#include
using namespace std;
long long sum;
bool check;
int n,a[100005];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
if((long long)a[i]>sum+1)
{
printf("%lld\n",sum+1);
check=1;
break;
}
sum+=(long long)a[i];
}
if(!check)printf("%lld\n",sum+1);
return 0;
}
直接找规律推出公式,这是某dalao的做法,代码一看就懂
#include
#include
using namespace std;
long long n,ans;
int main()
{
scanf("%lld",&n);
ans=sqrt(n);
if(ans==n/ans)ans=ans*2-1;else ans*=2;
printf("%lld",ans);
}
直接枚举商,当然还有优化。我们知道,整型之间的除法得出的商是去除掉小数部分的,所以我们可以通过一些高(la)端(ji)操作,跳过商(商在题目里是整数)的重复部分。
#include
long long n,ans;
int main()
{
scanf("%lld",&n);
if(n==0||n==1)
{
printf("%d",1);
}
for(long long i=1;i<=n;i++)
{
long long a=n/i;
i=n/a;
ans++;
}
printf("%lld",ans);
return 0;
}
贪心
当a,b序列不一样时:
(1)交换 和 的值在b序列中所在的位置j 在 a序列中的位置的值 ,前提
(例如样例中, =3;3在b序列中是第4个数,发现a的第四个数和b的第四个数不相等,所以交换,得到新的a序列4,2,1,3)
(2)当a,b序列仍然不一样,但是(1)中无法找到可交换的数时:选取a,b序列中一个的数,交换 ,。
随机化大发好!水过去了(数据太水233333333333333)!
(不推荐!!!,不能保证上述步骤(1),(2)选的点是最优的,所以用多次随机数选点,整个过程算多次)
map用来记录达到这个序列的最小步骤,用状态压缩把序列压入一个数里
#include
#include
这才是正解!!!这是hqj dalao的代码,orzorz
用dfs实现,保证最终答案最优
#include
#include
#include