总算进div1了,留念一下。
A. Magic Numbers
怎么做都行,我用动态规划。看了别人的代码,他们用的是1包含14,14包含144。一次按照144,14,1,的顺序把开头的字母去掉。看能否把全部去掉。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#define LL long long
#define DB double
#define SF scanf
#define PF printf
#define N 109
#define bug cout<<"bug"<<endl;
using namespace std;
char ch[N];
int v[N];
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
cin>>ch+1;
int i,len =strlen(ch+1);
v[0] = 1;
for(i=1;i<=len;i++)
{
if(ch[i]=='1'&&v[i-1])
v[i] = 1;
if(i>1&&ch[i]=='4'&&ch[i-1]=='1'&&v[i-2])
v[i] = 1;
if(i>2&&ch[i]=='4'&&ch[i-1]=='4'&&ch[i-2]=='1'&&v[i-3])
v[i] = 1;
}
if(v[len]) PF("YES\n");
else PF("NO\n");
return 0;
}
B. Ping-Pong (Easy Version)
按照题目的条件建图,看能否从I1到I2。bfs。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#define LL long long
#define DB double
#define SF scanf
#define PF printf
#define N 209
#define bug cout<<"bug"<<endl;
using namespace std;
struct nod{
int l,r;
} re[N];
vector<int> L[N];
int cnt=1;
void oper(int k)
{
for(int i=1;i<k;i++)
{
if((re[i].l>re[k].l&&re[i].l<re[k].r)||
(re[i].r>re[k].l&&re[i].r<re[k].r))
L[i].push_back(k);
if((re[k].l>re[i].l&&re[k].l<re[i].r)||
(re[k].r>re[i].l&&re[k].r<re[i].r))
L[k].push_back(i);
}
}
int v[N];
void dfs(int k)
{
if(v[k]) return ;
v[k] = 1;
for(int i=0;i<(int)L[k].size();i++)
dfs(L[k][i]);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n;
SF("%d",&n);
int a,b,c;
while(n--)
{
SF("%d%d%d",&a,&b,&c);
if(a==1)
{
re[cnt].l = b;
re[cnt].r = c;
oper(cnt);
cnt++;
}else
{
memset(v,0,sizeof(v));
dfs(b);
PF("%s\n",v[c]?"YES":"NO");
}
}
return 0;
}
C. Malek Dance Club
思路很清晰,二进制一位一位考虑。画画就出来了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#define LL long long
#define DB double
#define SF scanf
#define PF printf
#define N 209
#define bug cout<<"bug"<<endl;
using namespace std;
char ch[N];
int n ;
const LL mod = 1000000007;
LL get(int k)
{
LL ret = 1;
for(int i=0;i<k;i++)
{
ret*=2;
if(ret>=mod) ret%=mod;
}return ret;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
SF("%s",ch);
n = strlen(ch);
LL ans = 0;
for(int i=n-1;i>=0;i--)
{
int t = 2*n-i-2;
if(ch[i]=='1')
ans += get(t);
if(ans>=mod) ans%=mod;
}cout<<ans<<endl;
return 0;
}
D. Psychos in a Line
考虑第k个人是被谁杀的。他可以被他前一个人杀,如果杀不了,则被杀掉前一个人的人所杀,类推。找到能杀掉第k个人的人。次数+1。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <string>
#define LL long long
#define DB double
#define SF scanf
#define PF printf
#define N 100009
#define bug cout<<"bug"<<endl;
using namespace std;
int pre[N];
int dp[N];
int re[N];
int ans;
int n;
void solve()
{
for(int i=1;i<=n;i++)
{
int tmp =0 ;
for(int k=i-1;k;k=pre[k])
{
if(re[k]>re[i])
{
pre[i] = k;
dp[i]=tmp+1;
break;
}
tmp = max(tmp,dp[k]);
}
}
int ans =0;
for(int i=1;i<=n;i++)
{
// cout<<dp[i]<<" ";
if(ans<dp[i]) ans = dp[i];
}//cout<<endl;
PF("%d\n",ans);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
SF("%d",&n);
for(int i=1;i<=n;i++) SF("%d",&re[i]);
solve();
return 0;
}
e题不会。都没看懂题。