选择题编程题都不怎么难。主要看下编程题。
第一道题就比较简单的。
#include "iostream"
using namespace std;
int Max(int m,int n){
int r,temp;
if(m<n){
temp = m;
m = n;
n = temp;
}
while(n!=0){
r = m%n;
m=n;
n=r;
}
return m;
}
int Min(int m,int n,int max){
int t;
t = m*n/max;
return t;
}
int main()
{
int m,n,max,min;
cin>>m>>n;
max = Max(m,n);
min = Min(m,n,max);
cout<<max<<endl;
cout<<min;
return 0;
}
这道题暴力查找肯定不行,容易超时,采用动态规划容易实现。
#include <iostream>
using namespace std;
int const maxn = 1000;
int a[maxn];
long long f[maxn];
int main() {
int n,sum;
cin>>n>>sum;
for (int i=1;i<=n;i++) {
cin>>a[i];
}
f[0] = 1;
for (int i=1;i<=n;i++) {
for (int j=maxn;j>=0;j--) {
if(j>=a[i]) {
f[j] += f[j-a[i]];
}
}
}
cout<<f[sum]<<endl;
}
如果是(k+1)的整数倍,第一个人取任何一个1到k内的任意数x,第二个人都可以取(k+1-x)个石子,那么,第一个人必败的条件就是k+1的整数倍。反之,如果不是k+1的整数倍,第一人可以取n%(k+1)个石子,从而第二个人必败。
#include <iostream>
using namespace std;
int main()
{
int n,k,t;
cin>>t;
while(t--)
{
cin>>n>>k;
if(n%(k+1))
cout<<"A"<<endl;
else
cout<<"B"<<endl;
}
return 0;
}