题目
题解
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))