7.12测试

惨不忍睹

第一题:最大那个什么质因数

我都不知道质数的唯一且最大的因数就是自己,还写了个是质数就直接continue了...把那个去掉就AC了....

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int prime(int a)
{
	if(a==1) 
		return 0;
	for(int k=2;k<=sqrt(a);k++)
	{
		if(a%k==0) return 0;
	}
	return 1;
}
int tcl(int a)
{
	int t,k;
	for(k=a;k>=sqrt(a);k--)
	{
		t=a/k;
		if(a%k==0 && (prime(k)))
		{
			return k;
		}
	}
	return 0; 
}
int main()
{
	int n,a[5001],i,max=0,tmp=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if(tcl(a[i])>max) 
		{
			
			max=tcl(a[i]);
			tmp=a[i]/tcl(a[i]);
		}	
	}
	int ans=tmp*max;
	printf("%d",ans);
	return 0;
} 

第二题 输油管道问题

不知道为什么数学方法日常不对

AC:

#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
	int t,a[10002],i,x;
	scanf("%d",&t);
	int dis=0;
	for(i=0;i<t;i++)
		scanf("%d%d",&x,&a[i]);
	sort(a,a+t);
	t--;
	for(i=0;i<t;i++)
		dis+=a[t--]-a[i];
	printf("%d
",dis);
	return 0;
}

第三题 开关

这题需要一些思维,从第一排开始算,以此类推

#include <iostream>
#include <cstdio>
using namespace std;
#define INF 0x3fffff
char k[5][5]; int a[5][5];
int vx[5] = {-1, 0, 1, 0, 0}, vy[5] = {0, 1, 0, -1, 0};
void click(int c, int t) {
    for(int i = 0; i < 5; ++i)
        if(c + vx[i] >= 0 && t + vy[i] >= 0 && c + vx[i] < 5 && t + vy[i] < 5){
            a[c + vx[i]][t + vy[i]] ^= 1;
       }

}
int main() {
    int T; 
    scanf("%d", &T);
    while(T--) {
        for(int i = 0; i < 5; ++i)
            for(int j = 0; j < 5; ++j)
                cin>>k[i][j];
        for(int i = 0; i < 5; ++i)
            for(int j = 0; j < 5; ++j)
                a[i][j] = (int)(k[i][j] - '0');
        int ans = INF, cnt = 0, flag = 0;
        for(int i = 0; i < 32; ++i) {
            flag = 0; cnt = 0;
            for(int j = 0; j < 5; ++j)
                if((i >> j) & 1) ++cnt, click(0, j);
            for(int j = 0; j < 4; ++j) {
                for(int k = 0; k < 5; ++k) {
                    if(!a[j][k]) ++cnt, click(j + 1, k);
                }

            }
            for(int i = 0; i < 5; ++i)
                for(int j = 0; j < 5; ++j)
                    if(!a[i][j]) {flag = 1; break;}
            if(!flag) ans = min(ans, cnt);
            for(int i = 0; i < 5; ++i)
                for(int j = 0; j < 5; ++j)
                    a[i][j] = k[i][j] - '0';
        }
        if(ans == INF || ans > 6) printf("%d
", -1);
        else printf("%d
", ans);
    }

}

第四题 最长公共上升子序列

分析清楚两个之间的关系,然后dp求解

#include<cstdio>
#include<iostream>
using namespace std;
#define N 3005
int a[N],b[N],f[N],g[N],l,k;
int main(){
    scanf("%d",&l);
    for(int i=1;i<=l;i++) scanf("%d",&a[i]);
    for(int i=1;i<=l;i++) scanf("%d",&b[i]);
    for(int i=1;i<=l;i++){
        k=0;
        for(int j=1;j<=l;j++){
            if(a[i]==b[j])
                if(f[k]+1>f[j]){
                    f[j]=f[k]+1;g[j]=k;
                }
            if(a[i]>b[j]) if(f[k]<f[j]) k=j;
        }
    }
    k=0;
    for(int i=1;i<=l;i++) if(f[k]<f[i]) k=i;
    printf("%d
",f[k]);
    return 0;
}

一二题以后务必调好,因为可能有好多好多问题,像第二题真的就只过了个样例....

原文地址:https://www.cnblogs.com/LSWorld/p/712test.html