codeforces 320

总算进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题不会。都没看懂题。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值