一、握手问题
组合问题,手算
#include<bits/stdc++.h>
using namespace std;
int main()
{
printf("%d",25*49-21);
return 0;
}
二、小球反弹
没写
三、好数
枚举
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
bool is_valid(int cnt,int d)
{
if((cnt%2!=0&&d%2!=0)||(cnt%2==0&&d%2==0))
return true;
else
return false;
}
int main()
{
int n;
scanf("%d",&n);
int ans;
for(int i=1;i<=n;i++)
{
int flag=1;
int num=i;
int cnt=0;//记录是第几位
while(num>0)
{
cnt++;
int d=num%10;
if(!is_valid(cnt,d))
{
flag=0;
break;
}
num/=10;
}
if(flag==1)
ans++;
}
printf("%d",ans);
return 0;
}
四、R格式
高精度,板子没背,用longlong简单写了一下,拿了1/4的分
#include<bits/stdc++.h>
using namespace std;
int main()
{
double n,d;
scanf("%lf%lf",&n,&d);
double a=pow(2,n)*d;
double c=a*100;
long long o=c;
int p=o%10;
if(p>=5)
printf("%lld",o/100+1);
else
printf("%lld",o/100);
return 0;
}
五、宝石组合
没写
六、数字接龙
dfs
#include<bits/stdc++.h>
using namespace std;
const int N=12;
int next8[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
int g[N][N];
string path;
bool edge[N][N][N][N];
bool st[N][N];
int n,k;
bool dfs(int a,int b)
{
//到达终点
if(a==n-1&&b==n-1)
return path.length()==n*n-1;
st[a][b]=true;
for(int i=0;i<8;i++)
{
//下一个位置
int x=a+next8[i][0],y=b+next8[i][1];
//如果越界
if(x<0||y<0||x>n-1||y>n-1) continue;
//如果没有走过
if(st[x][y]) continue;
//按照大小顺序
if(g[x][y]!=(g[a][b]+1)%n) continue;
//不可以交叉
if(i%2!=0)//斜方向走时
if(edge[x][b][a][y]||edge[a][y][x][b])
continue;
st[x][y]=true;
edge[a][b][x][y]=true;
path+=i+'0';
if(dfs(x,y)) return true;
st[x][y]=false;
path.pop_back();
edge[a][b][x][y]=false;
}
st[a][b]=false;
return false;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&g[i][j]);
if(dfs(0,0))
cout<<path<<endl;
else
printf("-1");
return 0;
}
七、拔河
算一个序列里两数之差最小值:可以先sort,再遍历序列找相邻两数的最小值
数据到1e9最好开longlong
数组l的大小是N*(n-1)/2,从n个里面选两个,有C(2,n)个
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,M=N*(N-1)/2;
typedef long long LL;
LL a[N];
LL s[N];
LL l[M];//从n个里面选两个
int main()
{
int n;
scanf("%lld",&n);
for(LL i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
s[i]=s[i-1]+a[i];
}
LL cnt=0;
//将每个区间的力量和存在一个数组里
for(LL i=1;i<=n;i++)
for(LL j=i;j<=n;j++)
{
if(i==1&&j==n) continue;
l[cnt++]=s[j]-s[i-1];
}
sort(l,l+cnt);
LL m=1e9;
for(LL i=1;i<cnt;i++)
m=min(m,l[i]-l[i-1]);
printf("%lld",m);
return 0;
}