[CodeForces Div2]7.30 总结

T1 模拟

题意梗概:给出四个方向的旋转轮子,输入一个初始状态/结束状态,和一个旋转次数n。问是顺时针转出来的还是逆时针转出来的,如果两者都可以输出 undefined

纯模拟没什么好思考的.

#include <cstdio>
#include <cstring>
#include <string> 
#include <iostream>
using namespace std;
char s[20];
int n,start,end;
int main(){
    s[0]=getchar();
    getchar();
    s[1]=getchar();
    if(s[0]==118){
        start = 1;
    }
    else if(s[0]==60){
        start = 2;
    }
    else if(s[0]==94){
        start = 3;
    }
    else{
        start = 4;
    }
//    cout<<s[1]<<endl;
    if(s[1]==118){
        end = 1;
    }
    else if(s[1]==60){
        end = 2;
    }
    else if(s[1]==94){
        end = 3;
    }
    else{
        end = 4;
    }
    cin>>n;
    n%=4;
    //cout<<start<<" "<<end<<endl;
    if((start+n-1)%4+1 == end && (start+3-n)%4+1 == end){
        cout<<"undefined"<<endl;
    }
    else if( (start+n-1)%4+1 == end){
        cout<<"cw"<<endl;
    }
    else{
        cout<<"ccw"<<endl;
    }
    return 0;
}

 

T2 模拟

题意梗概:给出n个入口,以及k个守卫。每个守卫只能守一个门口,在这个门口如果还有客人的要来的情况下不能离开这个门口。

输入进入入口的顺序,问k个是否可以够用。

一道比较水的模拟题目,具体看代码注释。

#include <cstdio>
#include <cstring>
int n,k,vis[233],a[1000005],NEW[233],tot,used;
char s[1000005];
int main(){
    scanf("%d%d",&n,&k);
    //如果门卫比要来的人还多 那么一定可以的 
    if(k>=n) {
    printf("NO\n");
    return 0;
    }
    scanf("%s",s);
    for(int i=0;i<n;i++){
        int now = s[i]-'A';
        //vis表示当前入口要来的人数
        //a将字母储存为数字 
        vis[now]++;
        a[i] = now;
    }
    //tot表示当前需要的门卫数量 
    for(int i=0;i<n;i++){
        vis[a[i]]--;
        //如果这个入口没人守,那么需要派遣一个人去守护。 
        if(NEW[a[i]]==0) NEW[a[i]]=1,tot++;
        //先后顺序很重要 这里WA了两次 
        //如果需要的人数大于k 那么一定是守不住的 
        if(tot>k) {
            printf("YES\n");
            return 0;
        }
        //当前入口没人了 就不用守护了 
        if(vis[a[i]]==0) tot--;
    }
    printf("NO\n");
    return 0;
}

 

 

T3 二分

题目梗概: 两个人喊出两个数字,以喊的快的人的数字K,把快的人会乘上K^2,慢的人乘上K,给出n对数。问是否可以通过这个游戏来完成

思考: 一开始认为是质因数分解,后来想了想复杂度不对 $n (\sqrt{a}+\sqrt{b})$ 不出意外会TLE。于是乎,到最后也没有想出来解法。(虽然想到了二分,但是不知道怎么二分答案)

不得不说,这个二分还是很妙的,让我大开眼界。

设$a = x^{2}y $ $b = xy^{2}$ 

那么$ab=\left ( xy \right )^{3}$

设$xy=p$

我们二分枚举p的取值

之后p还必须满足$\frac{a}{p} = x$  $\frac{b}{p} = y$ 

代码实现:

#include <bits/stdc++.h>
typedef long long ll;

const int Maxn=1e6+5;

ll check(ll x){
    ll l = 0,r=Maxn;
    ll m;
    while(l<r){
        m = (l+r+1)/2;
        //printf("l:%I64d r:%I64d m:%I64d\n",l,r,m);
        if(m*m*m>x)  r = m - 1;
        else l = m ;
    }
    return l;
}

int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        ll a,b;
        scanf("%I64d%I64d",&a,&b);
        ll x = check(a*b);
        if(x*x*x != a*b) printf("No\n");
        else if(a%x==0 && b%x==0) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

 

T4DP+线段树 (目前水平有限不会写)

所以这个坑等之后来填=。=

 

转载于:https://www.cnblogs.com/OIerLYF/p/7262734.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值