Codeforces Round #426 (Div. 2)
哎,再想想应该能写出第三题的!!!
A. The Useless Toy
题目大意:给你两个方向的箭头,再给你旋转的次数,问你是顺时针还是逆时针还是不确定。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define first fi #define second se #define ll long long #define pb push_back #define pii pair<int,int> #define mk make_pair using namespace std; int n; int work(char g) { if(g==118) return 0; else if(g==60) return 1; else if(g==94) return 2; else if(g==62) return 3; } int main() { int n; char a[3],b[3]; int x,y; scanf("%s%s",a,b); cin>>n; //printf("%d %d\n",a[0],b[0]); x=work(a[0]); y=work(b[0]); //cout<<x<<endl; //cout<<y<<endl; int now=n%4; if((x+now)%4==y && (x-now+4)%4==y) puts("undefined"); else if((x+now)%4==y) puts("cw"); else if((x-now+4)%4==y) puts("ccw"); else puts("undefined"); return 0; }
B. The Festive Evening
题目大意:有26扇门和,k个哨兵,有n个人进门,每个人只能进特定的门,从这扇门的第一个人进来的时候就
需要一个哨兵,最后一个人走这个哨兵才能离开,问你哨兵够不够。
思路:记录一下每扇门经过的人数,从头模拟一下。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; const int N=1e6+5; int n,k,vis[30]; bool judge[30]; char s[N]; int main() { cin>>n>>k; scanf("%s",s); for(int i=0;i<n;i++) vis[s[i]-'A']++; for(int i=0;i<n;i++) { if(!judge[s[i]-'A']) { judge[s[i]-'A']=true; k--; if(k<0) { puts("YES"); return 0; } vis[s[i]-'A']--; if(vis[s[i]-'A']==0) k++; } else { vis[s[i]-'A']--; if(vis[s[i]-'A']==0) k++; } //cout<<k<<endl; } puts("NO"); return 0; }
C. The Meaningless Game
题目大一:给你n组数,没组里面有两个数字a,b,表示两个人最后的分数,问你有没有可能经过若干轮达到变成这两个数,
每个人的分数刚开始都为1,每次选一个数x,赢的人分数 *x^2 另一个人的分数 *x。
思路:妈的!!想到关键点了都没做出来,我好笨啊啊啊啊!!!! 我想到两个人得分数相乘一定是一个数的三次方。
这是个必要条件,那么我们就可以先预处理处1e18以内所有数的三次方,二分查找就行了。然后我就在想怎么保证这
a,b都合法呢,我就一个劲地往他们的gcd方向想,什么枚举因子啥的,哎。其实我们把a可以看成 三个数的乘积,k1*k1*k2
b可以看成 k2*k2*k1。 k1就是所有第一个人赢的数字的乘积,k2是所有第二个人赢的数字的乘积,而我们二分查出来的是
k1*k2, 所以我们只要判断一个 a和b能不能被 k1*k2整除就行了。。反省反省反省,这题不难!!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e6; ll x,y,vis[1000006]; int main() { for(ll i=0;i<1e6;i++) vis[i]=(i+1)*(i+1)*(i+1); int n; cin>>n; while(n--) { ll x,y; scanf("%I64d%I64d",&x,&y); ll sum=x*y; int item=lower_bound(vis,vis+1000000,sum)-vis; if(vis[item]!=sum) { puts("No"); continue; } item++; if(x%item==0 && y%item==0) puts("Yes"); else puts("No"); } return 0; }
总结:我他妈就是傻逼!