codeforces Canada cup 2016 A~D

6 篇文章 0 订阅
5 篇文章 0 订阅

题目

codeforces Canada cup 2016

题解

A

题意:一个小球,一个序列,’>’表示往右走,’<’表示往左走,如果一直按这个方法走下去,会掉到地上,那么从这个位置出发就不行。问从多少个位置出发是不行的,
题解:找到左边第一个’>’,之前的’<’均为不可行,右边类似。(我一开始还去判环,可怕。代码也是判环的)

By qwsin, contest: Canada Cup 2016, problem: (A) Jumping Ball, Accepted, #
 //QWsin
#include<stack>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=200000+10;

char s[maxn];
int inst[maxn],wont[maxn],n,ok=1;

stack<int>st;
void dfs(int u)
{
    st.push(u);inst[u]=1;
    int d=s[u]=='<'?-1:1;
    if(u+d < 1||u+d>n) {inst[u]=-1;st.pop() ;return ;}
    else if(inst[u+d]==1||wont[u+d]){
        while(!st.empty()){
            wont[st.top()]=1;st.pop();
        }ok=1;inst[u]=-1;return ;
    }
    else if(inst[u+d]==-1) {inst[u]=-1;st.pop() ;return ;}
    else dfs(u+d);
    inst[u]=-1;
    if(!ok)st.pop();
}

int main()
{
    int cnt=0;cin>>n;
    scanf("%s",s+1);
    for(int i=1;i<=n;i++) 
        if(!inst[i]) ok=0,dfs(i);
    for(int i=1;i<=n;i++) if(!wont[i]) cnt++;
    cout<<cnt;
    return 0;
}

B

题意:空姐服务乘客的顺序,对于每一行是fedabc,然后是先1,3行,然后走一格,然后2,4行,然后走三格,服务5,7,以此类推,服务一个人或者走一格花费单位时间,问某个乘客被服务的时间。(两个空姐是独立的,1f与3f同时被服务)
题解:以4为一个循环节,直接搞。

//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;

char s[30];

int isnum(char ch){return ch>='0'&&ch<='9';}
inline ll getnum(int l,int r)
{
    ll ret=0;
    for(int i=l;i<=r;i++) ret=ret*10+s[i]-'0';
    return ret;
}

int main()
{
    scanf("%s",s+1);ll l=strlen(s+1),x;char ch;
    for(int i=1;i<=l;i++) if(!isnum(s[i])) x=getnum(1,i-1),ch=s[i];
    ll sum=(x-1)/4*16;x=x-(x-1)/4*4;
    if(ch=='f'&&(x==1||x==3)) sum+=1;
    if(ch=='e'&&(x==1||x==3)) sum+=2;
    if(ch=='d'&&(x==1||x==3)) sum+=3;
    if(ch=='a'&&(x==1||x==3)) sum+=4;
    if(ch=='b'&&(x==1||x==3)) sum+=5;
    if(ch=='c'&&(x==1||x==3)) sum+=6;
    if(ch=='f'&&(x==2||x==4)) sum+=8;
    if(ch=='e'&&(x==2||x==4)) sum+=9;
    if(ch=='d'&&(x==2||x==4)) sum+=10;
    if(ch=='a'&&(x==2||x==4)) sum+=11;
    if(ch=='b'&&(x==2||x==4)) sum+=12;
    if(ch=='c'&&(x==2||x==4)) sum+=13;
    cout<<sum;
    return 0;
}

C

题意:给你一串字母27个(有且只有一个重复),要求你构造一个2*13的矩阵,每一个格子可以走到相邻的八连通块,起点任意,使得遍历完矩阵后路径所给的字母串。

题解:我分了两种情况,两个相同的字母间隔为奇数个的时候采取如下构造(下面给出的是局部矩阵)

1 2 3 4 5
6 7 8 9 10

路径 10->4->3->2->1->6->7->8->9->4 ,其中4 重复了 这样就能类似的解决所有奇数个间隔
偶数路径 10->5->4->3->2->1->6->7->8->9->5 其中5重复了。实际构造时采用先构造出这个环然后顺着填后面的(如果填到最后了倒回去填第一个)。

//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

char s[50],ans[3][20];
int pos[50],l,pos1,pos2;
int inc(int &x){return x=x%l+1;}
int main()
{
    scanf("%s",s+1);
    l=strlen(s+1);
    for(int i=1;i<=l;i++)
    {
        if(!pos[s[i]-'A']) pos[s[i]-'A']=i;
        else {pos1=pos[s[i]-'A'],pos2=i;break;}
    }
    int inmid=pos2-pos1-1;
    if(!inmid){printf("Impossible\n");return 0;}
    if(inmid&1)
    {
        int d=(inmid-1)/2,cnt=0;
        int curx=1,cury=d+1,p=pos1-1;
        for(;cury>=1;cury--) ans[curx][cury]=s[inc(p)],cnt++;
        curx=2,cury=1;
        for(;cury<=d+1;cury++) ans[curx][cury]=s[inc(p)],cnt++;
        inc(p);curx=1;cnt++;
        for(;cury<=13&&cnt<27;cury++) ans[curx][cury]=s[inc(p)],cnt++;
        if(cnt<27) for(curx=2,cury=13;cnt<27;cury--) ans[curx][cury]=s[inc(p)],cnt++;
    }
    else 
    {
        int d=inmid/2,cnt=0;
        int curx=1,cury=d+1,p=pos1-1;
        for(;cury>=1;cury--) ans[curx][cury]=s[inc(p)],cnt++;
        curx=2,cury=1;
        for(;cury<=d;cury++) ans[curx][cury]=s[inc(p)],cnt++;
        cury++;inc(p);curx=1;cnt++;
        for(;cury<=13&&cnt<27;cury++) ans[curx][cury]=s[inc(p)],cnt++;
        if(cnt<27) for(curx=2,cury=13;cnt<27;cury--) 
            ans[curx][cury]=s[inc(p)],cnt++;
    }
    printf("%s\n%s",ans[1]+1,ans[2]+1);
    return 0;
}

D

题意:很多个队,每个队有气球,气球多的排名靠前,但是每个队有重量,气球超过重量就会上天(233),给出你所在的队伍和其他队伍的相关信息,你现在搞事情:可以把你的气球送给别的队,问你能通过搞事情到达的最靠前的排名

题解:考虑我要送给谁,肯定是排名在我前面的,此时排名在我前面的都一样了,不可能说搞掉rank2只要1个但是搞掉rank1要10个你去搞掉rank1.。。所以对于在我前面的,按我需要送的气球数量小根堆维护。送了之后会掉气球,可能会掉rank,最开始先排个序,然后模拟掉rank的场景,把超过我的依次扔进小根堆。每次执行完一轮搞事情之后更新答案(心机啊,想起某省恶意泄题使得省选人数-1的事情)。

//QWsin
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=300000+10;
inline ll read()
{
    ll ret=0;char ch=getchar();
    while(ch<'0'||ch>'9') ch=getchar();
    for(;ch>='0'&&ch<='9';ch=getchar()) ret=ret*10+ch-'0';
    return ret;
}

struct Node{
    ll sc,w;Node(ll sc=0,ll w=0):sc(sc),w(w){}
    bool operator < (const Node &rhs)const{
        return w-sc+1 > rhs.w-rhs.sc+1;
    }
    inline void input(){sc=read();w=read();}
}a[maxn];

int cmp(Node a,Node b){return a.sc > b.sc;}

ll mysc,myw;
int main()
{
    int n=read();n--;
    mysc=read();myw=read();
    for(int i=1;i<=n;i++) a[i].input();
    sort(a+1,a+n+1,cmp);

    priority_queue<Node>pq;
    int myrank=0,p;
    while(a[myrank+1].sc > mysc) pq.push(a[++myrank]);

    p=myrank;int ans=++myrank;
    while(1)
    {
        if(pq.empty()) break;
        Node k=pq.top();pq.pop();
        if(k.w-k.sc+1 > mysc) break;
        mysc-=k.w-k.sc+1;
        myrank--;
        while(p+1<=n&&a[p+1].sc > mysc) pq.push(a[++p]),myrank++;
        ans=min(ans,myrank);
    }
    cout<<ans;
    return 0;
}

E

不会做,待填坑。(所以本蒟蒻只能过掉大众题(AC人数>1000))

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值