最高高度の
アイデアを見つける:接頭辞を付けて合計し、元のシーケンスを復元してから、最大値を維持します
class Solution {
public:
int largestAltitude(vector<int>& gain) {
int ma=0,now=0;
for(auto &x:gain){
now+=x;
ma=max(ma,now);
}
return ma;
}
};
言語を教える必要がある最小人数の
考え方:まず、各人が話すことができる言語を数えます。a[i] [j] = 1は、i番目の人がj番目の言語を話すことができることを意味します。
次に、各言語を列挙し、最小値を維持し、現在の言語を学習した複雑さn ^ 3の
ベクトルで保存します。
新しい学習者の言語は、終了するたびに削除されることに注意してください。
class Solution {
public:
int minimumTeachings(int n, vector<vector<int>>& l, vector<vector<int>>& f) {
int ans=505;
int a[505][505]={
0};
for(int j=0;j<l.size();j++){
for(int k=0;k<l[j].size();k++){
a[j+1][l[j][k]]=1;
}
}
for(int i=0;i<=n;i++){
vector<int> an;
for(int j=0;j<f.size();j++){
int F=0;
for(int k=1;k<=n;k++){
if(a[f[j][0]][k] && a[f[j][1]][k]){
F=1;
break;
}
}
if(F==0){
if(a[f[j][0]][i]) a[f[j][1]][i]=1,an.push_back(f[j][1]);
else if(a[f[j][1]][i]) a[f[j][0]][i]=1,an.push_back(f[j][0]);
else a[f[j][1]][i]=1,a[f[j][0]][i]=1,an.push_back(f[j][1]),an.push_back(f[j][0]);
}
}
ans=min(ans,(int)an.size());
for(auto &X:an){
a[X][i]=0;
}
}
return ans;
}
};
XORをデコードした後の配置
思考:それは思考の質問です。データに注意してください。nは奇数です。その場合、彼によって与えられたシーケンスの長さは偶数であり、これは明らかにxorの性質に関連しています。
与えられたシーケンスでプレフィックスxorを試してみましょう。
取得できるシーケンスは次のようになります。a
[1] ^ a [2] a [1] ^ a [3] a [1] ^ a [4]…a [1] ^ a [n]
プレフィックスXORをすべてXORします。一度に(nが5であると仮定)
x =
a [1] ^ a [2] ^ a [1] ^ a [3] ^ a [1] ^ a [4] ^ a [1] ^ a [5] =
a [2] ^ a [3] ^ a [4] ^ a [5]
は、a [1]を除く他の数値のxor値と同じです。
nの値がわかっているので、z = 1 ^ 2 ^ 3 ^ 4 ^ 5…^ nを見つけることができます
。a[1]を除くすべての数値が2回表示されるため、x xorzはa [1]の値を取得します。
このように、a [1]とプレフィックスXORシーケンスをxorに入れるだけで、a [2] a [3] ... a [n]の値を取得できます。
class Solution {
public:
vector<int> decode(vector<int>& e) {
int x=0;
for(int i=1;i<e.size();i++) e[i]^=e[i-1];
for(auto &y:e) x^=y;
int z=0;
for(int i=1;i<=e.size()+1;i++) z^=i;
vector<int> ans;
ans.push_back(z^x);
for(int i=0;i<e.size();i++) ans.push_back(ans[0]^e[i]);
return ans;
}
};
製品配列を生成するためのスキーム
の数のアイデア:それがボールボックスモデルであることは簡単にわかります。製品は素因数分解を考えるのは簡単です。
したがって、ボックスに入れられた同じ品質係数の場合、ボールは同じですが、ボックスが異なることを意味します。
つまり、パーティション方式で十分です。
分割法の式はC(n + m-1、m-1)です。ここで、nはボールの数、mはボックスの数です。
しかし、この質問nとmは1e4であり、スコープが非常に大きく、スペースが十分ではありませんか?
2 ^ 14> 1e4、つまり、ボールの数は実際には1ダースであることに注意してください。
次に、C(n、m)= C(n、nm)であることがわかります。
したがって、C(n + m-1、m-1)= C(n + m-1、n + m-1-(m-1) )= C(n + m-1、n)
Yang Hui三角形を使用して、組み合わせの数を前処理できます。2番目の次元は13に到達するだけで済みます。
typedef long long ll;
const ll mod=1e9+7;
ll dp[10055][15];
class Solution {
public:
vector<int> ans;
vector<int> waysToFillArray(vector<vector<int>>& q) {
dp[0][0]=1;
for(int i=1;i<10050;i++){
dp[i][0]=1;
for(int j=1;j<14;j++){
dp[i][j]=(dp[i-1][j]+dp[i-1][j-1])%mod;
}
}
for(auto &X:q){
ll now=1;
int m=X[0],x=X[1];
for(int i=2;i*i<=x;i++){
if(x%i==0){
int n=0;
while(x%i==0) ++n,x/=i;
now*=dp[n+m-1][n];//C(n+m-1,m-1)=C(n+m-1,n)
now%=mod;
}
}
if(x!=1){
now*=dp[1+m-1][1];
now%=mod;
}
ans.push_back(now);
}
return ans;
}
};