1. 程式人生 > 其它 >吳凡的題庫——快快程式設計701-800

吳凡的題庫——快快程式設計701-800

  1. 位運算lowbit
題目描述
二進位制位運算中,有個很實用的函式叫lowbit,低位數值。定義lowbit(n)表示n的二進位制表示中最低位的1代表是十進位制的幾。例如十進 制數6對應2進 制110其中最低位的1代表2;十進位制數8對應2進位制1000其中最低位的1代表8. 請實現lowbit函式的運算:輸入十進位制正整數n,輸出lowbit(n)的返回值。
輸入輸出格式
輸入格式
輸入一個正整數n。n<=10^10
輸出格式
輸出一個正整數
輸入輸出樣例
輸入樣例#1:
6
輸出樣例#1:
2
輸入樣例#2:
3
輸出樣例#2:
1
輸入樣例#3:
100
輸出樣例#3:
4
#include<iostream>
using namespace std;
int lowbit(int a){
	return a&(-a);
}
int main(){
	int x;
	cin>>x;
	cout<<lowbit(x);
	return 0;
}
  1. 位運算bitcount
題目描述
輸入十進位制正整數n,輸出n的二進位制共有幾位?其中有幾個1?有幾個0?
輸入輸出格式
輸入格式
輸入一個正整數n。n<=10^10

輸出格式
輸出3個整數,由空格隔開。
輸入輸出樣例
輸入樣例#1:
6
輸出樣例#1:
3 2 1
輸入樣例#2:
2
輸出樣例#2:
2 1 1
輸入樣例#3:
100
輸出樣例#3:
7 3 4
#include<iostream>
using namespace std;
int CountBit(int x){
	int ret = 0;
	while(x){
		ret++;
		x >>= 1;
	}
	return ret;
}
int CountOne(int x){
	int ret = 0;
	while(x){
		ret++;
		x &= x-1;
	}
	return ret;
}
int main(){
	int a;
	cin>>a;
	int all, one, zero;
	all = CountBit(a);
	one = CountOne(a);
	zero = all - one;
	cout<<all<<" "<<one<<" "<<zero;
	return 0;
}
  1. 二進位制小數
題目描述
輸入一個二進位制數,帶有小數點和3位小數。請輸出對應的十進位制數,保留3位小數。 輸入一行,如題。 輸出一個浮點數。
輸入輸出格式
輸入格式
輸入一個二進位制數,帶有小數點和3位小數。

輸出格式
請輸出對應的十進位制數,保留3位小數。

輸入輸出樣例
輸入樣例#1:
100.100

輸出樣例#1:
4.500
輸入樣例#2:
1111.111
輸出樣例#2:
15.875
輸入樣例#3:

輸出樣例#3:

#include<bits/stdc++.h>
using namespace std;
int main(){
	string s;
	cin>>s;
	double ans=0;
	int i;
	for(i=0;i<s.size();i++){
		if(s[i]=='.')break;
		ans *= 2;
		if(s[i]=='1')ans++;
	}
	if(s[i+1]=='1') ans += 0.5;
	if(s[i+2]=='1') ans += 0.25;
	if(s[i+3]=='1') ans += 0.125;
	cout<<fixed<<setprecision(3)<<ans;
	return 0;
}
  1. 出棧順序
題目描述
從1到n的n個整數準備依次入棧,其間會伴隨著n次出棧操作,但是入棧和出棧的前後順序有點混亂,需要你來幫忙確定最終的出棧順序。輸入2*n個操作指令,包含n次push和n次pop。push代表入棧,pop代表出棧。在保證操作均合法的情況下,請輸出出棧順序。
輸入輸出格式
輸入格式
輸入第一行為正整數n,第二行為2*n個字串操作指令,有空格隔開。n<=100000。
輸出格式
輸出一行包含n個數字代表出棧順序,有空格隔開。
輸入輸出樣例
輸入樣例#1:
3
push push push pop pop pop
輸出樣例#1:
3 2 1
輸入樣例#2:
2
push pop push pop

輸出樣例#2:
1 2
輸入樣例#3:

輸出樣例#3:

#include<iostream>
#include<string>
using namespace std;
const int N=100009;
int stk[N], top=0;
void push(int x){
	stk[++top]=x;
}
void pop(){
	top--;
}
int main(){
	int num;
	cin>>num;
	int t1=1;
	string s;
	for(int i=0;i<num*2;i++){
		cin>>s;
		if(s=="push")
			push(t1++);
		else{
			cout<<stk[top]<<" ";
			pop();
		}
	}
	return 0;
}
  1. a乘b
題目描述
輸入兩個整數a,b,請計算兩個整數的乘積
輸入輸出格式
輸入格式
輸入檔案ab.in
輸入一行包含兩個整數,有空格隔開,絕對值均不超過1000000000
輸出格式
輸出檔案ab.out
輸出一個整數
輸入輸出樣例
輸入樣例#1:
2 3
輸出樣例#1:
6
輸入樣例#2:
無
輸出樣例#2:
無
輸入樣例#3:
無
輸出樣例#3:
無
#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("ab.in", "r", stdin);
	freopen("ab.out", "w", stdout);
	long long result, a, b;
	cin>>a>>b;
	result = a * b;
	cout<<result<<endl;
	return 0;
}
  1. 格子染色1
題目描述
有一排格子需要染色,每個格子只可以是RGB這3種顏色之一,要求相鄰兩格不能同色。目前有些格子已經有固定顏色不能改變了,剩下的格子可以選擇 列。
輸入輸出格式
輸入格式
輸入檔案color.in
輸入一行字串,長度<=10
輸出格式
輸出檔案color.out
輸出若干行字串,行末沒有空格
輸入輸出樣例
輸入樣例#1:
RoR
輸出樣例#1:
RBR
RGR
輸入樣例#2:
無
輸出樣例#2:
無
輸入樣例#3:
無
輸出樣例#3:
無
#include<bits/stdc++.h>
using namespace std;
int n, p[11];
void print(){
	for(int i=1;i<=n;i++)
		if(p[i]==0)
		    cout<<'B';
		else if(p[i]==1)
		    cout<<'G';
		else if(p[i]==2)
		    cout<<'R';
	cout<<endl;
}
void dfs(int x){
	if(x==n+1){print();return;}
	if(p[x]>=0){dfs(x+1);return;}
	for(int i=0;i<3;i++)
	    if(x==1&&p[2]!=i||x==n&&p[n-1]!=i||x>1&&x<n&&p[x-1]!=i&&p[x+1]!=i){
	    	p[x]=i;
	    	dfs(x+1);
	    	p[x]=-1;
		}
}
int main(){
	freopen("color.in", "r", stdin);
	freopen("color.out", "w", stdout);
	char ch;
	while(cin>>ch){
		++n;
		if(ch=='B')p[n]=0;
		else if(ch=='G')p[n]=1;
		else if(ch=='R')p[n]=2;
		else p[n]=-1;
	}
    p[0]=p[n+1]=-1;
	dfs(1);
	return 0;
}
  1. 汪星人
題目描述
你是一隻汪星人,地球毀滅後你回到了汪星,這裡每天有n個小時,你需要為自己選擇正好連續的m小時作為每天睡眠的時間。從凌晨開始,第i小時內的睡眠質量為xi,請問經過選擇後,你的睡眠質量總和最大是多少?
輸入輸出格式
輸入格式
輸入檔案dog.in
輸入第一行為正整數n,m,1<=m<=n<=100000. 第二行為n個整數依次代表每小時的睡眠質量,絕對值均不超過100
輸出格式
輸出檔案dog.out
輸出一個整數
輸入輸出樣例
輸入樣例#1:
5 2
1 -1 -1 -1 2
輸出樣例#1:
3
輸入樣例#2:
無
輸出樣例#2:
無
輸入樣例#3:
無
輸出樣例#3:
無
#include<bits/stdc++.h>
#define N 100003
using namespace std;
int s[N],x[N],n,m;
int main(){
	freopen("dog.in","r",stdin);
	freopen("dog.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>x[i];
	for(int i=1;i<=n;i++)s[i]=s[i-1]+x[i];
	int ans=s[m];
	for(int i=m+1;i<=n;i++)ans=max(ans,s[i]-s[i-m]);
	for(int i=1;i<=m-1;i++)ans=max(ans,s[i]+s[n]-s[n-m+i]);
	cout<<ans<<endl;
	return 0;
}
  1. 魔擬賽1
題目描述
為了備戰全宇宙程式設計大賽,我們開展魔鬼式訓練,共舉辦n場模擬賽,每天一場。每一場你都可以選擇參加或者不參加,但是要注意:不 能出現連續兩 天都參加,因為連續訓練會積勞成疾。請問你有多少種不同的訓練安排?
因為該數字可能非常大,請輸出方案數對1000007取模的結果。
輸入輸出格式
輸入格式
輸入檔案monster.in
輸入第一行為正整數n, 0<=n<=100

輸出格式
輸出檔案monster.out
輸出一個整數

輸入輸出樣例
輸入樣例#1:
2
輸出樣例#1:
3
輸入樣例#2:
8
輸出樣例#2:
55
輸入樣例#3:

輸出樣例#3:

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("monster.in", "r", stdin);
	freopen("monster.out", "w", stdout);
	int n, f[101];
	cin>>n;
	f[1] = 2;
	f[2] = 3;
	for(int i=3; i<=n; i++)
		f[i] = (f[i-1] + f[i-2]) % 1000007;
	cout<<f[n] % 1000007;
	return 0;
}
  1. 福利發放
題目描述

極客帝國共n個國民,國家發行的數字貨幣極客幣大獲成功,極客帝國決定向國民發放福利,賬戶上小於等於X極客幣的人都可以獲得福利,求發放福利的總人數是多少。現在面向公眾徵求意見,共提出m種方案(方案可能相同),你需要計算每一種方案發放福利的人數。

資料規模,n<=100000,m<=100000,X<=109,賬戶最大存款餘額不超過109。

輸入輸出格式
輸入格式
輸入檔案fuli.in
第一行,n和m,n表示極客帝國人數,m表示方案數量。
第二行,n個整數,表示每個國民賬號內極客幣數量。
第三行,m個整數,表示m種福利發放方案,賬號內低於或等於該數字的人都可以獲得福利。
輸出格式
輸出檔案fuli.out
每行一個整數,表示該方案下有多少個人可以獲得福利。
輸入輸出樣例
輸入樣例#1:
7 3
100 150 80 30 50 200 70
100
150
75
輸出樣例#1:
5
6
3
輸入樣例#2:
無
輸出樣例#2:
無
輸入樣例#3:
無
輸出樣例#3:
無
說明
#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("fuli.in", "r", stdin);
	freopen("fuli.out", "w", stdout);
	int n, m, a[100001], x;
	cin>>n>>m;
	for(int i=0;i<n;i++)cin>>a[i];
	sort(a, a+n);
	for(int i=0;i<m;i++){
		cin>>x;
		int ux=upper_bound(a,a+n,x)-a;
		cout<<ux<<endl;
	}
    return 0;
}
  1. 有理數
題目描述
數學家康託證明了有理數(某整數除以某整數)是可列舉的。證明非常巧妙,小學生也能看得懂,他用了下面這一張表來說明任意給定的有理數都會在 表格裡出現。
1/1
1/2
1/3
1/4
1/5
1/6
2/1
2/2
2/3
2/4
2/5
…
3/1
3/2
3/3
3/4
…
…
4/1
4/2
4/3
…
…
…
5/1
5/2
…
…
…
…
6/1
…
…
…
…
…
這張表格的填寫順序為Z字型填寫:1/1, 1/2, 2/1, 3/1, 2/2, 1/3, 1/4, 2/3, …
請問表格中第n個填寫的是幾分之幾呢?注意不需要約分。
輸入輸出格式
輸入格式
輸入一個正整數n,n<=10000000
輸出格式
輸出一個整數,一個斜槓/,再一個整數,中間沒有空格
輸入輸出樣例
輸入樣例#1:
7
輸出樣例#1:
1/4
輸入樣例#2:
10
輸出樣例#2:
4/1
輸入樣例#3:

輸出樣例#3:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	int id=1;
	int cnt=0;
	while(cnt+id<n){
		cnt+=id;
		id++;
	}
	if(id%2==0)
	    cout<<n-cnt<<"/"<<id-(n-cnt)+1<<endl;
	else
	    cout<<id-(n-cnt)+1<<"/"<<n-cnt<<endl;
	return 0;
}
  1. 公里數
題目描述
某輛車的里程錶出現了故障:它總是跳過數字3和數字8。也就是說,當前顯示已走過兩公里時,如果車子再向前走一公里,那麼將顯示4 公里,而不是3公里(數字3跳過了)。再比如,當前是15229公里,車子再向前走一公里,顯示的是15240公里,而不是15230公里。數字8也同樣跳過。
寫一個程式,根據里程錶上顯示的數字,計算車子真正走了多少公里。
輸入輸出格式
輸入格式
輸入檔案gls.in 故障里程錶顯示的公里數s(1≤s≤1000000)
輸出格式
輸出檔案gls.out 正確的公里數
輸入輸出樣例
輸入樣例#1:
15
輸出樣例#1:
12
樣例說明:
1到15數字中,包含數字3、8、13
輸入樣例#2:
2
輸出樣例#2:
2
輸入樣例#3:

輸出樣例#3:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll countk(ll x, ll k){
	ll cnt=0;
	do{
		if(x%10==k)cnt++;
		x /= 10;
	}while(x);
	return cnt;
}
int main(){
	freopen("gls.in", "r", stdin);
	freopen("gls.out", "w", stdout);
	ll n, ans=0;
	cin>>n;
	for(ll i=1; i <=n; i ++)
		if(countk(i, 3)==0&&countk(i, 8)==0)
			ans ++;
	cout<<ans<<endl;
	 
	return 0;
}
  1. 幸運整數(BestAC by業皓展)
題目描述
小明對數字“5”和“8”非常感興趣,認為是幸運數字,那麼僅用幸運數字組成的整數就是幸運整數,請你幫助小明找出從5開始從小到大第k個幸運整數。
輸入輸出格式
輸入格式
僅一行包含一個正整數k(k≤300)。

輸出格式
僅一行包含一個正整數,為第k個幸運整數。

輸入輸出樣例
輸入樣例#1:
3
輸出樣例#1:
55
【樣例說明】
第1個幸運整數5開始從小到大,第2個是8,第3個是55。

輸入樣例#2:

輸出樣例#2:

輸入樣例#3:

輸出樣例#3:

#include<iostream>
using namespace std;
typedef long long ll;
bool lucky(ll x){
	do{
		ll r = x % 10;
		if(r != 5 && r != 8)	return 0;
		x /= 10;
	}while(x);
	return 1;
}
int main(){
	ll k, n=5, i=1;
	cin>>k;
	while(i<k){
		n ++;
		if(lucky(n))	i ++;
	}
	cout<<n<<endl;
	return 0;
}