(1)大概是對一個序列中統計每個數的二進制的位數1個數,並對其按1的個數歸類,輸出總共有幾類
#include<iostream>
#include<set>
#include<vector>
using namespace std;
int getCount(long& num){
int cnt = 0;
while(num){
if(num&1)cnt++;
num >>= 1;
}
return cnt;
}
int main(){
int T;
while(cin>>T){
vector<int> res;
for(int j = 0; j < T; j++){
int n;
cin>>n;
set<int> ans;
for(int i = 0; i < n; i++){
long temp;
cin>>temp;
ans.insert(getCount(temp));
}
res.push_back(ans.size());
}
for(auto x : res)cout << x << endl;
}
return 0;
}
(2)泳池蓄水,泳池容量m, 時間t, 每分進水m1容量, t1時間後由給水管切換開關狀態, 每分鐘排水m2, t2時間後排水管切換開關狀態,求經過t分鐘後有多少容量s的水,0 <= s <= m 。
int func(int &m, int &t, int &m1, int &t1, int &m2, int &t2){
int sum = 0, cur = 0;
bool jishui = true, paishui = true;
int tm = m, tt = t, tm1 = m1, tt1 = t1, tm2 = m2, tt2 = t2;
while(cur < tt){
if(jishui&&paishui){
sum += tm1 - tm2;
if(sum >= tm) sum = tm;
else if(sum <= 0) sum = 0;
}else if(!jishui && paishui){
sum -= tm2;
if( sum <= 0)sum = 0;
}else if(jishui && !paishui){
sum += tm1;
if( sum >= tm)sum = tm;
}
tt1--;
if(tt1==0){
if(jishui)jishui = false;
else jishui = true;
tt1 = t1;
}
tt2--;
if(tt2==0){
if(paishui)paishui = false;
else paishui = true;
tt2 = t2;
}
cur ++;
}
return sum;
}
(3)在一個只有大寫字母的字符串,最多變換兩個字符,使得字符變換後連續的”N“最長。
int func(string &s){
vector<int> indexs;
int len = s.length();
for(int i = 0; i < len; i++)if(s[i] != 'N')indexs.push_back(i);
if(indexs.size() <= 2)return len;
int maxx = 0;
for(int i = 0; i < indexs.size() - 1; i++){
int l = indexs[i] - 1, r = indexs[i + 1] + 1;
while(l>=0 && s[l] == 'N')l--;
while(r < len && s[r] == 'N')r++;
l++, r--;
maxx = max(maxx, r - l + 1);
}
return maxx;
}
(4)給一個數組a代碼發電站羣,一個數組b代表洪水羣,a[i]代表第i個發電站的海拔,b[i]代表第i次洪水高度,每次發洪水,a中每個數海拔小於等於b的,就要失聯。兩兩相鄰的話是一個羣體,相鄰關係可以傳遞。求最後失聯羣體數。(這題只過40%,浪費一個小時時間,看錯題目意思,後面匆匆寫了,時間複雜度沒過,只有4分鐘了。。。。。。)
#include<iostream>
#include<vector>
using namespace std;
int main(){
int T;
cin >> T;
vector<long> a(T, -1);
for(int i = 0; i < T; i++)
cin >> a[i];
int q;
cin >> q;
vector<int> res;
for(int i = 0; i < q; i++){
vector<int> temp(a.begin(), a.end());
long qq;
cin >> qq;
for(int j = 0; j < T; j++)
if(qq >= temp[j])temp[j] = -1;
int cnt = 0, index = 0;
while(index < T){
if(temp[index]!=-1){
cnt++;
while(index < T && temp[index]!=-1)index++;
}
index++;
}
res.push_back(cnt);
}
for(auto x : res)cout << x << endl;
return 0;
}
筆試完研究了一下這題,感覺在多了複製和循環,一旦T和q特別大的時候,就很耗時,作出下面的改進,不復制不賦值,時間複雜度在O(q*T),這樣在時間上肯定是不會有問題的,如果有,可能也是邊界條件,也就是第一個數和最後一個數可能做一下特殊處理,其實改動不大,只是看錯題意,浪費了好多時間!!!
#include<iostream>
#include<vector>
using namespace std;
int main(){
int T;
cin >> T;
vector<long> a(T, -1);
for(int i = 0; i < T; i++)
cin >> a[i];
int q;
cin >> q;
vector<int> res;
for(int i = 0; i < q; i++){
long qq;
cin >> qq;
int cnt = 0, index = 0;
while(index < T){
if(a[index] > qq){
cnt++;
while(index < T && a[index] > qq)index++;
index--;
}
index++;
}
res.push_back(cnt);
}
for(auto x : res)cout << x << endl;
return 0;
}