牛客練習賽23 B C D

2021-08-21 20:16:51 字數 2227 閱讀 5112

a 貪心思想,盡量選大的,這樣支出的紙票數量和硬幣數量之和最小

**:

#includeusing namespace std;

int yuan=;

int fen=;

int num[20];

int main()

for(int i=0;i<6;i++)

for(int i=0;i<=12;num[i]=0,i++) printf("%d%c",num[i],i==12?'\n':' ');

} }

b 找規律

設 f[i] 代表數字 i 的最大得分

我們可以得到:

f[1]=0

f[2]=11=1

f[3]=f[2]+f[1]+21=1+0+2=3

f[4]=f[2]+f[2]+22=1+1+4=6

f[5]=f[3]+f[2]+32=3+1+6=10

f[6]=f[3]+f[3]+33=3+3+9=15

f[7]=f[4]+f[3]+43=6+3+12=21

為什麼我們要把 n 分成均勻或者接近均勻的兩份呢?因為基於貪心思想,這樣會使得結果更大啊,證明?不會誒。。。

接下來這個規律就好找了吧

f[2]-f[1]=1

f[3]-f[2]=2

f[4]-f[3]=3

f[5]-f[4]=4

f[6]-f[5]=5

f[7]-f[6]=6

…f[n]-f[n-1]=n-1

所以f[n]=(1+n-1)(n-1)/2=n(n-1)/2

其實就是公差為1的等差數列字首和

**:

#includeusing namespace std;

int main()

}

c 其實多想一想,就可以做出來

k 沒看到要輸出,白白wa了四次,以為是自己**有問題,就檢查**去了,輸出都看不清楚。。。

我的思路:

從大到小列舉按位與的最低位bit(0<=bit<=30),也就是列舉30-0這些位

如果符合情況就立即break,也就是找到答案了,並且要實時儲存集合裡面符合情況的數

不符合就繼續

怎麼知道符不符合情況呢?其實你想一想,當乙個數第bit位為1時,我們肯定是要把它加入集合的,為什麼?我們加入這個數的話,比bit位低的位就更有可能按位與為0了啊,這樣按位與的最低位就更有可能為bit位 ,是不是?想一想

所以列舉按位與的最低位bit時,我們就把第bit位為1的數全部按位與起來,如果得到的數的最低位小於1 << bit,就不符合情況,因為存在比bit位更低位全部為1的情況,這樣bit位就不是按位與的最低位了。

要是還沒理解,看**吧

**:

#includeusing namespace std;

const int maxn=100000+100;

int ans[maxn];

int tmp[maxn];

int main()

} if(now==-1 || (now&(-now))<(1我們可以列舉所有 『a』-『i』 的排列,看這種排列是否是字串的子串行,是的話貢獻就+1

怎麼判斷該排列是否是字串的子串行呢?

每一種排列的每個字元都有順序的吧(也就是位置關係),前乙個字元比後乙個字元出現的位置肯定是要靠前的,也就是下標要小一點,所以我們只需要判斷該排列的乙個字元在字串中出現的位置是否都存在大於前面字元在字串中出現的位置,我提前用vector存好了 』a』-『i』 在字串的多個位置,所以判斷位置關係,在這些vector上進行二分即可(詳細看**),如果排列的每個位置字元都滿足情況,就說明該排列是字串的子串行,貢獻+1

詳細請看**吧

**:#include#include#include#includeusing namespace std;

const int maxn=3000+100;

char ch[maxn];

int id[maxn];

vectorg[10];

int ind[10]=; //相當於'a'-'i'

int main()

locate=g[ind[i]][locate];

}if(isok) ans++;

}while(next_permutation(ind,ind+9));

printf("%d\n",ans);

}return 0;

}

牛客練習賽9

時間限制 c c 1秒,其他語言2秒 空間限制 c c 32768k,其他語言65536k 64bit io format lld 珂朵莉想每天都給威廉送禮物,於是她準備了n個自己的本子 她想送最多的天數,使得每天至少送乙個本子,但是相鄰兩天送的本子個數不能相同 珂朵莉最多送幾天禮物呢 第一行乙個整...

牛客練習賽15

時間限制 c c 2秒,其他語言4秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 第一次期中考終於結束啦!沃老師是個語文老師,他在評學生的作文成績時,給每位學生的分數都是乙個小於10的非負小數。amy 8.99999999999999999999...

牛客練習賽5

給你n個正整數,n 5,每個正整數大小不超過1000,最初su m 0 sum 0 每次可將su m sum 按順序加上陣列中的數,加完之後可以對sum的數字進行全排列,求最終能達到的最大值。由於n只有5,所以按照題意模擬dfs實現就可以了,注意最後一組也可以按數字進行全排列。d題 include ...