代码填空 :LIS 题库连接
#include <stdio.h>
#include <stdlib.h>
#define N 100009
int f[N], a[N];
int n;
int find(int l, int r, int x) {
while (l < r) {
int mid = (l + r) / 2;
if (f[mid] < x) {
l = mid + 1;
} else {
r = mid;
}
}
return l;
}
int lis() {
int len = 0;
for (int i = 0; i < n; i++) {
int k = find(0, len, a[i]);
f[k] = a[i];
if (k == len) {
len++;
}
}
return len;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", a + i);
}
printf("%d\n", lis());
return 0;
}
核心思想:设原序列为a[],模拟一个栈为f[],遇到的数比栈顶大,入栈,比栈顶小,找到一个最应该被替换掉的数。
find(int l, int r, int x) int k = find(0, len, a[i]);中,l最开始传入的0,为可以替代的数的位置,为栈顶位置,r为栈顶,a[i]为遇到的数。
找质数 题库链接
#include <stdio.h>
int a[1000000];
int iszs(int n){
int flag=0;
if(n==2)
flag=1;
else if(n>2)
{
for(int i=2; i<n; i++){
if(n%i==0){
flag=0;
break;
}
else flag=1;
}
}
return flag;
}
int main(){
int t;
scanf("%d",&t);
for(int i=0; i<t; i++){
scanf("%d",&a[i]);
}
for(int i=0; i<t; i++){
for(int j=2;j<=a[i]/2; j++){
if(iszs(j)==1){
int r = a[i]-j;
if(iszs(r)==1){
printf("%d %d\n",j,r);
break;
}
}
else continue;
}
}
return 0;
}
这段代码10组数据通过3组,但是运行超时。判断是否是质数太复杂,而且判断出错,只能通过3组,修改判断质数的方法,需要用倍数筛选法。
#include<stdio.h>
int a[1000000];
void isprime(){
for(int i=0; i<1000000; i++)
a[i]=1;
a[0]=a[1]=0;
for(int i=2;i<1000;i++){
if(a[i]==1){
for(int j=i*2; j<1000000; j=j+i)
a[j]=0;
}
}
}
int main(){
int t,n;
isprime();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=2; i<=n/2; i++){
if(a[i]==1&&a[n-i]==1){
printf("%d %d\n",i,n-i);
break;
}
}
}
return 0;
}