今天晚上感觉情绪莫名的低落,openGL渲染一个小图搞了半天没搞好,还有一大堆的作业实验报告,还有比赛和考试要准备,感觉很烦,所以上hihocoder上敲了一点水题,让心情放松下来。一直不能掌控自己的情绪,总是容易被各种环境因素带节奏。根本原因还是自己弱的不行啊。
题目链接:https://hihocoder.com/contest/hihointerview21/problems
A题
给出4个数,求这4个数可以构造出来的最大时钟时间。
只有4个数,直接按字典序枚举这4个数的所有排列,判断是否可以构成一个时钟时间即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<iterator>
#include<algorithm>
using namespace std;
int a[4],ans[4];
bool flag;
//judge if the time is legal
bool Judge(int* arr)
{
if(arr[0]>2)return false;
else if(arr[0]<=1)return a[2]<6;
else{
return a[1]<4&&a[2]<6;
}
}
int main()
{
flag = false;
int x = 0;
for(int i=0;i<4;i++)
scanf("%d",&a[i]);
sort(a,a+4);
do{
x++;
if(Judge(a)){
flag = true;
memcpy(ans,a,sizeof(a));
}
}while(next_permutation(a,a+4));
//cout << x << endl;
if(!flag)
printf("NOT POSSIBLE\n");
else
printf("%d%d:%d%d\n",ans[0],ans[1],ans[2],ans[3]);
return 0;
}
B题
求最短的需要排序的子序列的长度
很显然,如果一个数比其前面的所有的数都要大,表现出来,就是比其前面最大的数还要大,那么这个数就不需要改变其与前面的数的相对位置。如果比其前面最大的数小,那么很显然需要交换,直接2分搜索找到其要交换的初始位置st[i],以当前位置为en[i].那么本题的答案就是
max{en[i]}−min{st[i]}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 100005
int curn,curmax,st,en,n;
int Arr[MAXN];
int binSearch(int s,int t,int tar)
{
int ans = 0;
while(s<=t){
int mid = (s+t)/2;
if(Arr[mid]>tar)t=mid-1;
else{
ans = mid;
s = mid+1;
}
}
return ans;
}
int main()
{
freopen("input","r",stdin);
int i;
scanf("%d",&n);
scanf("%d",&curmax);
Arr[0]=curmax;
st=en=-1;
for(i=1;i<n;i++){
scanf("%d",&Arr[i]);
if(Arr[i]>=curmax){
curmax = Arr[i];
continue;
}
else{
if(st<0)st=binSearch(0,i-1,Arr[i]);
en = i;
}
}
printf("%d\n",en-st);
return 0;
}
C题
有点意思的一道题,一个数可以使用二进制表示,现在允许二进制的系数为0,-1,1,问最少需要多少个二进制系数不为0.
发现了下面的公式:
∑n=in=j2n=2j+1−2i
其实就是等比数列求和公式的应用,那么就很简单了,记录当前时刻连续的二进制表示的1的数量,要注意的是此时产生了一个新的高位二进制1还有可能和其他的数聚合,代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define LL unsigned long long
LL n;
int curo;
int ans=0;
int main()
{
int bit;
scanf("%lld",&n);
curo=0;
while(n){
// cout << ans << endl;
bit = n&1;
if(bit)curo++;
else{
ans += min(curo,1);
if(curo==1){
curo=0;
}
else if(curo>=2){
curo=1;
}
else{}
}
n/=2;
//cout << curo << endl;
}
ans += min(2,curo);
printf("%d\n",ans);
return 0;
}
最后一点:淡定,从容,掌控情绪。。。
本文分享了作者在面对编程挑战时的情绪波动及如何通过解决简单问题来调整心态的经历,并提供了三道编程题目的解决方案,涉及时间构造、子序列排序长度计算及二进制系数优化。

被折叠的 条评论
为什么被折叠?



