小鱼的数字游戏:
代码:
#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,因此答案就是所有位数中最大的那一位的值。