洛谷(小鱼的数字游戏、进制转换、Cableway、Quasi Binary)

小鱼的数字游戏:

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
int q[N];
int main()
{
	int c=0;
	for(int i=0;i<110;i++){
		cin>>q[i];
		c=i;
		if(q[i]==0) break;
	}
	for(int i=c-1;i>=0;i--)cout<<q[i]<<' ';
	return 0;
}

对于这道题,主要用稍大一点的数组存下来,并知道其大小就好做了

查找:

 代码:

#include<iostream>
using namespace std;
const int N=1e6+10; 
int s[N],q,n;
int main(){
	cin>>n>>q;
	for(int i=0;i<n;i++)cin>>s[i];
	while(q--){
		int k;
		cin>>k;
		int l=0,r=n-1;
		while(l<r){
			int mid=l+r>>1;
			if(s[mid]>=k) r=mid;
			else l=mid+1;
		}
		if(s[l]!=k) cout<<"-1"<<' ';
		else{
			cout<<l+1<<' ';}
		}
	return 0;
}

又是一道二分题,本来用暴力做法结果超时,又仔细看了一下题目,抓住单调二字,就突然明白了

进制转换:

80代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{	int a;
	string b;
	vector<int> A;
	cin>>a>>b;
	int n=b.size();
	for(int i=0;i<n;i++) A.push_back(b[i]-'0');
	for(int i=0;i<n-1;i++){
		if(A[i]!=0){
			cout<<A[i]<<'*'<<a<<'^'<<n-i-1<<'+';
		}
	}
	if(A[n-1]!=0)cout<<A[n-1]<<'*'<<a<<'^'<<'0';
	return 0;
}

能想到高精度也算可以了,但是还是只对了80分 

到底哪里错了呢?

其实各种情况多试几次就知道错误原因了

发现它不一定是最后一个才不需要加号,可能它后面没有数了。

所以,改变一下判断方法。

100代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{	int a;
	string b;
	vector<int> A;
	cin>>a>>b;
	int n=b.size();
	for(int i=0;i<n;i++) A.push_back(b[i]-'0');
	for(int i=0;i<n;i++){
		if(i==0&&A[i]!=0)
			cout<<A[i]<<'*'<<a<<'^'<<n-i-1; 
		else if(i!=0&&A[i]!=0)
			cout<<'+'<<A[i]<<'*'<<a<<'^'<<n-i-1;
	}
	return 0;
}

第一个代码主要注意最后一位的处理, 第二个代码主要对第一位进行处理

Cableway:

 代码:

#include <iostream>
using namespace std;
int main()
{
    int r,g,b,sum;
    while(~scanf("%d %d %d",&r,&g,&b))
    {
        sum=29;
        while(r||g||b)
        {
            if(r>=2) r-=2;
            else if(r) r=0;
            if(r||g||b) sum++;
            if(g>=2) g-=2;
            else if(g) g=0;
            if(r||g||b) sum++;
            if(b>=2) b-=2;
            else if(b) b=0;
            if(r||g||b) sum++;
        }
        cout<<sum+1;
    }
    return 0;
}

考验你的逻辑思维啦!

Quasi Binary

 代码:

#include<iostream>
#include<cstdio>
using namespace std;
int ans,num[10];//最多9个数就一定可以构成n
int main()
{
	int n,res;
	scanf("%d",&n);
	for(int i=1;i<=n;i*=10)
	{
		res=(n/i)%10;//每一位的数值
		ans=max(ans,res);//ans求最大的一位数 
		for(int j=1;j<=res;++j) num[j]+=i;
	}
	cout<<ans<<endl;
	for(;ans;--ans) cout<<num[ans]<<' ';//倒序输出,从小到大
	return 0;
}

重要结论:

由于每一位最大是 1,所以对于一个数的某一位的值为 a,就至少需要 a 个数来填满这个位置。由于一个填充位置的数同时可以多个位置是 1,因此答案就是所有位数中最大的那一位的值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值