Codeforces Round #426 (Div. 2)

哎,再想想应该能写出第三题的!!!

A. The Useless Toy

题目大意:给你两个方向的箭头,再给你旋转的次数,问你是顺时针还是逆时针还是不确定。

#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;
}
View Code

 

B. The Festive Evening

题目大意:有26扇门和,k个哨兵,有n个人进门,每个人只能进特定的门,从这扇门的第一个人进来的时候就

需要一个哨兵,最后一个人走这个哨兵才能离开,问你哨兵够不够。

 

思路:记录一下每扇门经过的人数,从头模拟一下。

#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;
}
View Code

 

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整除就行了。。反省反省反省,这题不难!!

#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;
}
View Code

 

总结:我他妈就是傻逼!

 

posted @ 2017-07-31 14:53  NotNight  阅读(143)  评论(0编辑  收藏  举报