CodeForces - 1312C Adding Powers(思维+位运算)
題目鏈接:點(diǎn)擊查看
題目大意:給出大小為 n 的一個(gè)數(shù)組 a 和一個(gè)數(shù)字 K,每個(gè)位置起始時(shí)為 0 ,現(xiàn)在從 i = 0 開(kāi)始遞增,我們能夠進(jìn)行如下操作:
現(xiàn)在給出一個(gè)目標(biāo)數(shù)組,大小同樣為 n ,問(wèn)能否通過(guò)適當(dāng)?shù)牟僮鲗?shù)組 a 轉(zhuǎn)換到目標(biāo)數(shù)組
題目分析:比賽的時(shí)候自暴自棄了,第一反應(yīng)是模擬,在WA了一發(fā)后意識(shí)到細(xì)節(jié)過(guò)多,即使可以模擬實(shí)現(xiàn)的代碼復(fù)雜度也較高,于是嘗試轉(zhuǎn)變思路,然后就卡住了,對(duì)不起我真的太菜了
賽后看了大佬們的代碼,豁然開(kāi)朗,這不就是一個(gè)位運(yùn)算嘛。。給出的 K 我們視為進(jìn)制,將每個(gè)數(shù)字都視為 K 進(jìn)制下的一個(gè)數(shù)字,不難看出每個(gè)數(shù)字在 K 進(jìn)制下的分解是唯一的,而題目給出的操作就是給 K 進(jìn)制的某一位最多加一,換句話(huà)說(shuō),將所有數(shù)組拆為 K 進(jìn)制后,如果 K 進(jìn)制下每一位的出現(xiàn)次數(shù)都小于等于 1 的話(huà),那么說(shuō)明肯定是可行的,否則就是不可行的
代碼:
#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<unordered_map> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=110;LL n,k;int cnt[N];vector<LL>fac;void init() {memset(cnt,0,sizeof(cnt));fac.clear();fac.push_back(1);while(fac.back()<1e16)fac.push_back(fac.back()*k); }void solve(LL num) {while(num){for(int i=fac.size()-1;i>=0;i--)if(num>=fac[i]){num-=fac[i];cnt[i]++;}} }bool check() {for(int i=0;i<fac.size();i++)if(cnt[i]>1)return false;return true; }int main() { #ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--){scanf("%lld%lld",&n,&k);init();for(int i=1;i<=n;i++){LL num;scanf("%lld",&num);solve(num);}if(check())puts("YES");elseputs("NO");}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的CodeForces - 1312C Adding Powers(思维+位运算)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中石油训练赛 - 数学问题(思维)
- 下一篇: CodeForces - 1312D C