惨不忍睹
第一题:最大那个什么质因数
我都不知道质数的唯一且最大的因数就是自己,还写了个是质数就直接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;
}
一二题以后务必调好,因为可能有好多好多问题,像第二题真的就只过了个样例....