1题 跑步练习
3880
2题 阶乘约数
39001250856960000
3题 出栈次序
35357670
4.哥德巴赫分解
173
5.图书排列
479306
6.猴子分香蕉
3141
【分析】
1.跑步练习
第1分钟消耗600,第2分钟恢复300,即每2分钟消耗300。需要检查体力是否大于600,如果大于600,即可以完成一次循环;如果小于600,没有跑完1分钟体力就变0,所以也没办法休息。则直接计算还能跑多少秒。切忌用10000/300,因为要检查剩余体力是否大于600。
代码求解
#include<iostream>
using namespace std;
int solve(int n)
{
int m=0;
while(true)
{
if(n>600) //体力大于600,还能进行下一次循环
{
n-=600; //跑1分钟消耗600体力
}
else{ //600/60 每秒钟消耗多少体力 n/(600/60) n体力能跑多少秒
return m+n/(600/60);
}
n+=300; //休息1分钟提升300体力
m=m+2*60; //一个循环2分钟
}
}
int main()
{
cout<<solve(10000)<<endl;
return 0;
}
2题 阶乘约数
#include<iostream>
using namespace std;
const int M = 101;
long long a[M],b[M];
void init(int n){
if(n<2)return;
if(!a[n])for(int i=2;i*i<=n;i++){
if(!(n%i)){
init(i);
init(n/i);
return;
}
}
a[n]++;
return;
}
int main(){
for(int i=2;i<M;i++)init(i);
b[0]=1;
for(int i=2;i<M;i++)if(a[i])
for(int j=M-1;j>0;j--)
b[j] += b[j-1]*a[i];
long long ans = 0;
for(int i=0;i<M;i++)ans+=b[i];
cout << ans;
return 0;
}
3题 出栈次序
#include<iostream>
using namespace std;
const int M = 16;
int ans(int a,int b){
if(b==0)return 1;
int t=0;
for(int i=1;i<=a+1;i++){
t += ans(i,b-1);
}
return t;
}
int main(){
cout << ans(0,16);
return 0;
}
4.哥德巴赫分解
#include<iostream>
using namespace std;
const int M = 10000;
int ans=2;
int bo[M+1];
bool test(int x){
if(bo[x])return bo[x]==1?true:false;
for(int i=2;i*i<=x;i++){
if(!(x%i)){
bo[x]=2;
return false;
}
}
bo[x]=1;
return true;
}
int main(){
for(int i=4;i<=M;i+=2){
for(int j=2;j+j<=i;j++)if(test(j)){
if(test(i-j)){
ans= ans<j ? j:ans;
break;
}
}
}
cout<<ans;
return 0;
}
6.猴子分香蕉
#include<iostream>
#include<limits.h>
using namespace std;
int main(){
for(int i=6;i<INT_MAX;i++){
if((i-1)%5!=0) continue;
int m=i;
m-=1; //吃掉一个
m=m/5*4;
if(m<=0||(m-2)%5!=0) continue;
m-=2;
m=m/5*4;
if(m<=0||(m-3)%5!=0) continue;
m-=3;
m=m/5*4;
if(m<=0||(m-4)%5!=0) continue;
m-=4;
m=m/5*4;
if(m<=0||m%5!=0) continue;
cout<<i<<endl;
break;
}
return 0;
}
Excel地址
#include<iostream>
#include<string.h>
using namespace std;
long long n;
string tos(char c){
string s;
s += c;
return s;
}
string res(long long x){
if(x<26)return tos(char('A'+x%26));
return res(x/26-1)+char('A'+x%26);
}
int main(){
cin>>n;
cout<<res(n-1);
return 0;
}
10.日期问题
#include<cstdio>
#include<vector>
using namespace std;
int a[3];
const int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
struct Date{
int a,b,c;
}d[3];
bool com(Date x,Date y){
if(x.a!=y.a)return x.a<y.a;
if(x.b!=y.b)return x.b<y.b;
return x.c<y.c;
}
int main(){
scanf("%d/%d/%d",&a[0],&a[1],&a[2]);
d[0].a=a[0]+(a[0]<60?2000:1900),d[0].b=a[1],d[0].c=a[2];
d[1].a=a[2]+(a[2]<60?2000:1900),d[1].b=a[0],d[1].c=a[1];
d[2].a=a[2]+(a[2]<60?2000:1900),d[2].b=a[1],d[2].c=a[0];
for(int i=0;i<3;i++){
for(int j=i+1;j<3;j++){
if(!com(d[i],d[j])){
Date t=d[i];
d[i]=d[j];
d[j]=t;
}
}
}
for(int i=0;i<3;i++){
printf("%d-%02d-%02d\n",d[i].a,d[i].b,d[i].c);
}
return 0;
}
11.整数划分
#include<iostream>
using namespace std;
const int M = 10005;
int min(int x,int y){return x<y?x:y;}
int dp(int n,int m){
if(m<=1)return 1;
int sum=0;
for(int i=1;i<m;i++){
sum += dp(n-i,min(n-1,i));
}
return sum;
}
int main(){
int n;
cin>>n;
cout<<dp(n,n);
return 0;
}
12.一步之遥
#include<iostream>
using namespace std;
const int M = 1000;
int ans = 999999;
int main(){
for(int i=0;i<M;i++){
for(int j=0;j<M;j++){
if(i*97-j*127 == 1)ans = ans<(i+j)?ans:i+j;
}
}
cout<<ans;
return 0;
}
13.机器人塔
#include<iostream>
using namespace std;
int n,m,sum,a[1010],n1,m1;
bool judge(int a[]){
int i=0;
for(int j=1;i+j<n+m;j++){//从第一行开始判断
for(int k=0;k<j;k++){//每行的个数
if(a[i]==1){
if(a[i+j]!=a[i+j+1]){
return false;
}
}
if(a[i]==2){
if(a[i+j]==a[i+j+1]){
return false;
}
}
i++;
}
}
return true;
}
void A(int c[],int k){
if(k==n+m){
if(n1==n&&m1==m){
if(judge(c))
sum++;
}
}else{
for(int i=1;i<=2;i++){
if(i==1){
c[k]=i;
n1++;
A(c,k+1);
n1--;
}
else if(i==2){
c[k]=i;
m1++;
A(c,k+1);
m1--;
}
}
}
}
int main() {
cin>>n>>m;
A(a,0);
cout<<sum<<endl;
return 0;
}
14.七星填空
include<iostream>
#include<algorithm>
using namespace std;
int a[20]={1,2,3,4,5,7,8,9,10,12,13};
int main()
{
do
{
int x1=a[0]+a[1]+a[2]+a[3];
int x2=a[0]+a[4]+a[6]+a[9];
int x3=6+a[1]+a[4]+14;
int x4=6+a[2]+a[5]+11;
int x5=a[3]+a[5]+a[7]+a[10];
int x6=14+a[6]+a[8]+a[10];
int x7=a[9]+a[8]+a[7]+11;
if(x1==x2 && x1==x3 && x1==x4 && x1==x5 && x1==x6 && x1==x7)
{
for(int i=0;i<11;i++)
cout<<a[i]<<" ";
cout<<endl;
}
}while(next_permutation(a,a+10));
return 0;
}