2019/3/22更新
題目1 : Exam07_TwoSingleNumbers
時間限制:2000ms
單點時限:1000ms
內(nèi)存限制:256MB
描述
一個整型數(shù)組里除了兩個數(shù)字(互不相同)之外,其他的數(shù)字都出現(xiàn)了兩次。請寫程序找出這兩個只出現(xiàn)一次的數(shù)字。要求時間復(fù)雜度是O(n)庞萍,空間復(fù)雜度是O(1)状共。
輸入
第一行:數(shù)組的長度N(1<n<100000)
第二行:N個整數(shù),空格隔開
輸出
只出現(xiàn)了1次的那兩個數(shù)丰刊,小的在前大的在后泽裳,空格隔開
樣例輸入
10
5 5 6 7 9 9 7 3 3 2
樣例輸出
2 6
AC代碼
#include <iostream>
#include "stdio.h"
#include <string.h>
#include <math.h>
using namespace std;
typedef long long LL;
const int MAX=0x3f3f3f3f;
const int maxn = 10001;
int a[maxn], n;
int main()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
int t = 0, cnt = 0;
for(int i = 1; i <= n; i++) //對所有的數(shù)進行異或運算
t ^= a[i];
int tmp = t;
while(tmp % 2 == 0) {
cnt++;
tmp >>= 1;
}
int x = 0, y = 0;
for(int i = 1; i <= n; i++) //找出其中異或后為1的數(shù)
if((a[i] >> cnt)%2) x ^= a[i];
for(int i = 1; i <= n; i++) //同理
if((a[i] >> cnt)%2 == 0) y ^= a[i];
printf("%d %d\n", x, y);
return 0;
}
題目2 : Exam08_ChangeBit
時間限制:2000ms
單點時限:1000ms
內(nèi)存限制:256MB
描述
給定兩個整數(shù)A和B瞒斩,需要改變幾個二進制位才能將A轉(zhuǎn)為B。
輸入
1行:A和B诡壁,空格隔開
輸出
需要改變的位數(shù)
樣例輸入
10 8
樣例輸出
1
AC代碼
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
int A,B;
cin>>A>>B;
int num = 0;
for(int i = 0;i < 32;i++)
{
if(((A>>i)&1)!=((B>>i)&1))//向右移位同一位如果不一樣就要改變
num++;
}
cout<<num;
}
題目3 : Exam09_StrangeDonate
時間限制:1000ms
單點時限:1000ms
內(nèi)存限制:256MB
描述
地產(chǎn)大亨Q先生臨終的遺愿是:拿出100萬元給X社區(qū)的居民抽獎济瓢,以稍慰藉心中愧疚。
麻煩的是妹卿,他有個很奇怪的要求:
100萬元必須被正好分成若干份(不能剩余)。每份必須是7的若干次方元蔑鹦。比如:1元, 7元夺克,49元,343元嚎朽,...
相同金額的份數(shù)不能超過5份铺纽。
在滿足上述要求的情況下,分成的份數(shù)越多越好哟忍!
請你幫忙計算一下狡门,最多可以分為多少份?
輸入
固定輸入:1000000
輸出
最多可以分為多少份
樣例輸入
1000000
樣例輸出
無
AC代碼
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
int count = 0;
int visit[10] = {0};
int num;
void dfs(int step,int count) { //step代表7的幾次方
if(visit[step] > 5) {
//相同金額的份數(shù)不能超過5份
return;
}
if(count > 1000000) {
return;
}
else if(count == 1000000){
num = 0;
for(int i = 0; i < 10; i++)
{
num += visit[i];
}
cout<< num;
exit(0);
}
count += pow(7,step);
visit[step]++;
dfs(step, count);
//兩種路 visit[step]+1
dfs(step+1, count); //visit[step+1]+1
visit[step]--;
count -= pow(7,step);
}
int main() {
dfs(0,0);
return 0;
}