计算智能答案大全
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.多CASE练习
#include
#include
using namespace std;
long long gongbei(long long c,long long d)
{
long long bei,r;
bei=c*d;
while((r=c%d)!=0)
{
c=d;
d=r;
}
return bei/d;
}
int main()
{
//正确
long long c,d,n;
scanf("%lld",&n);
while(n--)
{
scanf("%lld%lld",&c,&d);
printf("%lld\n",gongbei(c,d));
}
printf("group 1 done\n");
while(scanf("%lld%lld",&c,&d)==2)
{
if(c==0&&d==0) break;
printf("%lld\n",gongbei(c,d));
}
printf("group 2 done\n");
while(scanf("%lld%lld",&c,&d)!=EOF)
{
printf("%lld\n",gongbei(c,d));
}
printf("group 3 done\n");
return 0;
}
2.It is not ugly number
#include
#include
#include
using namespace std;
typedef pair
int main()
{
unsigned result[1500];
priority_queue
q.push(node_type(1,2));
for(int i=0;i<1500;i++)
{
node_type node=q.top();
q.pop();
result[i]=node.first;
switch(node.second)
{
case 2 :q.push(make_pair(node.first*2,2));
case 3 :q.push(make_pair(node.first*3,3));
case 5 :q.push(make_pair(node.first*5,5));
}
}
unsigned long n,a;
freopen("data.txt", "r" ,stdin);
scanf("%ld\n",&n);
while(n--)
{
scanf("%ld\n",&a);
int high=1499,low=0,mid;
while(high>=low)
{
mid=(high+low)/2;
if((result[mid-1]{
printf("%ld\n",a+mid);
break;
}
else if(a+mid<=result[mid-1]) high=mid-1;
else low=mid+1;
}
}
return 0;
}
3.银行的叫号顺序
#include
#include
#include
using namespace std;
typedef struct
{
int num;
int time;
int lever;
char name[20];
}data;
struct cmp
{
bool operator() (data a,data b)
{
if(a.lever!=b.lever) return a.lever
else return a.num>b.num; //这种默认return不等号的右边,对比校赛排名的return true。
}
};
int main()
{
int n;
fr
eopen("data.txt", "r" ,stdin);
cin>>n;
priority_queue,cmp> q;
data a,b;
cin>>a.time>>a.lever>>;
a.num=1;
for(int i=0,j=0,k=1;j
while(a.time==i)
{
q.push(a);
if(k
scanf("%d%d%s",&a.time,&a.lever,);
k++;
a.num++;
}
else break;
}
while(i%5==0)
{
if(q.empty()) break;
else
{
b=q.top();
q.pop();
printf("%s\n",);
j++;
break;//一次只能叫一个人,注意这里
}
}
}
return 0;
}
4.校赛排名
#include
#include
#include
using namespace std;
typedef struct
{
int p;
int n;
int t;
char name[20];
}data;
bool cmp(data a,data b)
{
if(a.n>b.n)
return true;
else if(a.n==b.n&&a.t
else if(a.n==b.n&&a.t==b.t&&a.p
else
return false;
}
int main()
{
int N;
freopen("data.txt", "r", stdin);
freopen("data1.txt", "w", stdout);
scanf("%d",&N);
vector q;
for(int i=0;i
data a;
a.p=i;
scanf("%d%d%s",&a.n,&a.t,);
q.push_back(a);
}
sort(q.begin(),q.end(),cmp);
for(int i=0;i
printf("%s\n",q[i].name);
}
return 0;
}
5.巡逻的士兵
#include
#include
]);
for(int i = 0; i < m; i++) scanf("%d", &B[i]);
sort(A, A+n);
sort(B, B+m);
int g=0; // 当前需要砍掉的头的编号
int sum=0; // 当前总费用
for(int i=0; i
if(B[i] >= A[g])
{
sum+=B[i]; // 雇佣该骑士
if(++g==n) break; // 如果头已经砍完,及时退出循环
}
}
if(g
else
printf("%d\n", sum);
}
return 0;
}
7.排排座看电影
#include
#include
using namespace std;
long long A(int n)
{
return n==0?1:A(n-1)*n;
}
long long f(int a,int b,int k)
{
if (b==0)
return A(a);
if (a==0)
{
if (b==1&&k==0)
return 1;
return 0;
}
if (k==0)
{
return a*f(a-1,b,0)+b*f(a,b-1,1);
}
if (k==1)
{
if (a>1)
return a*f(a-1,b,0)+b*f(a,b-1,2);
return a*f(a-1,b,0);
}
if (k==2)
{
return a*f(a-1,b,0);
}
return 0;
}
int main()
{
int N;
cin>>N;
while (N--)
{
int a,b;
scanf("%d%d",&a,&b);
if (a==0)
{
printf("0\n");
continue;
}
if (b==0)
{
printf("%lld\n",A(a));
continue;
}
printf("%lld\n",a*f(a-1,b,0)+b*f(a,b-1,1));
}
return 0;
}
8.三角形
#include
#include
#include
using namespace std;
/*当a为斜边时,我们穷举最小边,此时最小边的取值范围为(1,sqrt(a2/2));
当a为直角边是,a2 = c2 - b2 ,此时
穷举c-b,c+b =a2/(c-b),得b=( a2/(c-b)-(c-b))/2 , c =( a2/(c-b)+c– b )/2*/
int main()
{
int N;
cin>>N;
while(N--)
{
int a,b,c,flat=0;
cin>>a;
for(int c_b=1;c_b{
b=(((a*a)/c_b)-c_b)/2;
c=(((a*a)/c_b)+c_b)/2;
if(c*c==(a*a+b*b))
{
printf("%d,%d\n",c,b);
flat=1;
}
}
for(b=1;b
c=sqrt(a*a-b*b);
if(a*a==(c*c+b*b))
{
printf("%d,%d\n",c,b);
flat=1;
}
}
if(N!=0) printf("\n");
if(flat==0) printf("\n");
}
}
9.小明的密码
#include
#include
#include
using namespace std;
int n,m,ans,a[50];//a数组是用来储存该数字,每个位储存一个数位
int prime[40]={0},f[20][5];
void judgeprime( )
{
prime[2]=1;prime[3]=1;
prime[5]=1; prime[7]=1;
prime[11]=1;prime[13]=1;
prime[17]=1;prime[19]=1;
prime[23]=1;prime[29]=1;prime[31]=1;
return ;
}
void solve(int flat)//flat代表当前位,n表示数的位数,m表示连续几位数的和是素数
{
if(flat>=n+1)
{
ans++;
return ;
}
int sum=0;
if(flat>=m)
{
for(int i=flat-m+1;i<=flat-1;i++)
{
sum+=a[i];
}
for(int i=0;i<=9;i++)
{
if(prime[sum+i])
{
a[flat]=i;
solve(flat+1);
}
}
}
else
{
for(int i=0;i<=9;i++)
{
a[flat]=i;
solve(flat+1);
}
}
return;
}
int main()
{
int T;
cin>>T;
judgeprime();
while(T--)
{
cin>>n>>m;
ans=0;
if(f[n][m]!=0)
cout<
{
solve(1);
f[n][m]=ans;
cout<
}
return 0;
}
10.N皇后问题
#include
#include
using namespace std;
/*用c,b,d三个数组分别记录棋盘上的n个列、
2n-1个正对角线、2n-1个负对角线*/
int a[20],b[20],c[40],d[40];
int n,t,i,j,k; //t记录解的个数,i控制行,j控制列
int tryr(int i)
{
for(int j=1;j<=n;j++) //j表示列号,第i个皇后有n种可能的位置
if(b[j]==0&&c[i+j]==0&&d[n+i-j]==0) //判断位置是否冲突
{
a[i]=j; //第i行第j列可以摆放编号为i的皇后
b[j]=1; //占领第j列
c[i+j]=1; d[n+i-j]=1; //占领两个对角线
if(i
b[j]=0;c[i+j]=0;d[n+i-j]=0; //回溯,清理现场,从低向上回溯
}
return 0;
}
int main()
{
int N;
cin>>N;
while(N--)
{
cin>>n; //输入皇后的个数
for(int i=1;i<=n;i++)
{
b[i]=0; //记录棋盘n个列
c[i+1]=0;c[n+i]=0; //记录棋盘负对角线
d[i]=0;d[n+i-1]=0; //记录棋盘正对角线
}
tryr(1);
printf("%d\n",t);
t=0;
}
return 0;
}
快乐
#include
ostream>
#include
int n,gethappy[51],losspow[51],power=2000,dp[51][2001];//n为输入的数据大小
using namespace std;
int main()
{
int i,j;
cin>>n;
for(i=0;i
for(i=0;i
for(j=0;j<=power;j++)//选取第一个数据
{
if(j>losspow[0])
dp[0][j]=gethappy[0];
else
dp[0][j]=0;
}
for(i=1;i
for(j=0;j<=power;j++)
{
if(j>losspow[i])//可以选取第i个数据
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-losspow[i]]+gethappy[i]);
}
else//不选取第i个数据
dp[i][j]=dp[i-1][j];
}
}
printf("%d",dp[n-1][power]+1);//1为初始快乐值
return 0;
}
数字三角
#include
#include
int a[105][105];
int main()
{
//freopen("in.txt", "r", stdin);
int n,i,j;
while (scanf("%d", &n) == 1)
{
memset(a, 0, sizeof(a));
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
scanf("%d", &a[i][j]);
}
}
for (i=n;i>1;i--)
{
for (j=i;j>=1;j--)
{
if(a[i][j]+a[i-1][j]>a[i][j+1]+a[i-1][j])
a[i-1][j]=a[i][j]+a[i-1][j];
else
a[i-1][j]=a[i][j+1]+a[i-1][j];
}
}
printf("%d\n", a[1][1]);
}
return 0;
}