您的位置:首页 > Web前端

Hihocoder [Offer收割]编程练习赛70 解题报告 By cellur925

2018-07-29 19:44 633 查看

并没有第四题。(还不会矩阵乘法加速线性数列)

 

题目1 : 数位翻转

时间限制:20000ms 单点时限:1000ms 内存限制:256MB

描述

给定一个数 n,你可以进行若干次操作,每次操作可以翻转 n 的二进制表示下的某一位,即将 0 变成 1,1 变成 0

现在小 Hi 想知道,至少需要多少次操作,才能将 n 变成 n-1

输入

一个正整数 n

1 ≤ n ≤ 109

输出

输出最少的操作次数

 

签到题,模拟一下取出各位二进制数即可,极水,怒A。

#include<cstdio>
#include<algorithm>

using namespace std;
typedef long long ll;

int n;
ll ans;
int a[30];
bool flag[30];

void dfs(int cnt,int a1,int a2,int pre)
{//cnt->当前已经选到第几个三角形
//a1->三角形中最短边,a2->三角形中最长边。
//pre->上一个选到哪了(下标)
if(cnt==ans+1)
{
printf("%d",ans);
exit(0);//void函数中想直接return 0结束程序用exit
}
if(!a1)
{
for(int i=pre+1;i<=n;i++)
{
if(flag[i]) continue;
flag[i]=1;
dfs(cnt,a[i],0,i);
flag[i]=0;
}
}
else if(a1>0&&a2<=0)
{
for(int i=pre+1;i<=n;i++)
{
if(flag[i]) continue;
flag[i]=1;
dfs(cnt,a1,a[i],i);
flag[i]=0;
}
}
else
{
for(int i=pre+1;i<=n;i++)
{
if(flag[i]) continue;
if(a1+a2<=a[i]) return ;
flag[i]=1;
dfs(cnt+1,0,0,0);
flag[i]=0;
}
}
}

int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+1+n);
for(int i=n/3;i>=0;i--)
{
ans=i;//要几个 当前在哪 现在已经有几个边
dfs(1,0,0,0);
}
printf("%d",ans);
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: