消去ゼロ
直接シミュレーション
B国家プロジェクト
最終ラウンドまでに必要なラウンド数を計算し、残りの日数を加算します。最後に、nより小さいかどうかを判断し、nより小さい場合は、さらに数日間実行します。
この質問は3回メンタリティが崩れたわ
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;cin>>T;
while(T--){
ll n, g, b;
cin>>n>>g>>b;
ll a = n;
n = (n+1)/2;
if(n == 0) {
cout<<a<<endl; continue;
}
ll ans = (n-1)/g * (g+b);
ans += n-(n-1)/g*g;
if(ans < a) ans = a;
cout<<ans<<endl;
}
}
Cパーフェクトキーボード
キーボードの最初の2文字がパスワードに従って確認された後、後者が確認されます。
#include<bits/stdc++.h>
using namespace std;
int vis[26];
int main()
{
int T;cin>>T;
while(T--){
string s; cin>>s;
string ans; ans.clear();
memset(vis, 0, sizeof vis);
ans += s[0]; int c = 0;
vis[s[0]-'a'] = 1;
int f = 1;
for(int i = 1; i < s.size(); ++i){
int x = s[i]-'a';
//cout<<"x:"<<x<<endl;
if(c+1 == ans.size() && !vis[x]){
ans += s[i]; c++; vis[x] = 1;
}else if(!vis[x]){
vis[x] = 1;
if(c == 0) ans = (char)(s[i])+ans;
else {
f = 0; break;}
}else{
if(c+1 < ans.size() && ans[c+1] == s[i]) c++;
else if(c-1 >= 0 && ans[c-1] == s[i]) c--;
else {
f = 0; break;}
}
}
if(!f) cout<<"NO"<<endl;
else {
cout<<"YES"<<endl;
for(int i = 0; i < 26; ++i) if(!vis[i]) ans += (char)(i+'a');
cout<<ans<<endl;
}
}
}
Dバッグを埋める
Sumがn未満であるかどうかを判断し、n未満の場合は解決策がないようにする必要があります。そうでない場合は、解決策があり(すべて1に置き換えられ
ます)、nの下位ビットから開始する必要があります。下位ビットの後、このビットの残りを組み合わせることができます。これが存在しない場合は、上から見上げて裏返します。入力ai a_ia私1e9未満なので、30ビットで十分です。
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define lowbit(x) ((x)&(-(x)))
#define mid ((l+r)>>1)
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
using namespace std;
int vis[64];
int main()
{
int T;cin>>T;
while(T--){
memset(vis,0,sizeof vis);
ll n; cin>>n;
int m; cin>>m;
ll sum = 0;
while(m--){
int x; scanf("%d", &x);
for(int i = 0; i < 30; ++i) if(x>>i&1) {
vis[i]++; break;}
sum += x;
}
if(sum < n){
cout<<-1<<endl; continue;
}
int ans = 0;
for(int i = 0; i < 32; ++i){
if(n>>i&1){
if(vis[i]) vis[i]--;
else {
for(int j = i+1; j < 32; ++j){
if(vis[j]){
while(j > i) {
vis[j]--;
j--; vis[j] += 2;
ans++;
}
break;
}
}
vis[i]--;
}
}
vis[i+1]+=(vis[i]/2);
}
cout<<ans<<endl;
}
}
Eサブシーケンスの消去
分割ポイントを列挙し、それらを2つの文字列に分割します。次にdp(i、j)dp(i、j)d p (i 、j )は、最初の文字列がiiと一致することを意味しますi、2番目の文字列はjjに一致しますjは少なくともssに一致する必要があります判断するいくつかの場所のs。
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define lowbit(x) ((x)&(-(x)))
#define mid ((l+r)>>1)
#define lson rt<<1, l, mid
#define rson rt<<1|1, mid+1, r
using namespace std;
const int maxn = 405;
int nxt[405][26];
char s[maxn];
char t[maxn];
int n;
int dp[maxn][maxn];
bool go(int n1, char *a, int n2, char *b){
dp[0][0] = 0;
for(int i = 0; i <= n1; ++i){
for(int j = 0; j <= n2; ++j){
if(i+j == 0) continue;
dp[i][j] = n+1;
if(i) dp[i][j] = min(dp[i][j], nxt[dp[i-1][j]][a[i]-'a']);
if(j) dp[i][j] = min(dp[i][j], nxt[dp[i][j-1]][b[j]-'a']);
}
}
return dp[n1][n2] <= n;
}
int main()
{
int T; cin>>T;
while(T--){
scanf("%s", s+1);
scanf("%s", t+1);
n = strlen(s+1);
for(int i = 0; i < 26; ++i) nxt[n][i] = nxt[n+1][i] = n+1;
for(int i = n-1;i >= 0;--i){
for(int j = 0;j < 26;++j) nxt[i][j] = nxt[i+1][j];
nxt[i][s[i+1]-'a'] = i + 1;
}
int f = 1;
int p = 0;
int len = strlen(t+1);
for(int i = 1; i <= len; ++i){
int x = t[i]-'a';
p = nxt[p][x];
if(p == n+1) f = 0;
}
if(f){
cout<<"YES"<<endl; continue;
}
for(int i = 1; i < len; ++i){
if(f) break;
if(go(i, t, len-i, t+i)){
f = 1;
}
}
if(f) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
/*
1
defi
fed
*/