Codeforces Round#467

CF937A Olympiad(模拟)

答案就是非0的数的种类数

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1000
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,cnt[N],ans=0;
int main(){
//  freopen("a.in","r",stdin);
    n=read();
    for(int i=1;i<=n;++i) cnt[read()]++;
    for(int i=1;i<=600;++i) if(cnt[i]) ans++;
    printf("%d\n",ans);
    return 0;
}

CF937B Vile Grasshoppers(数学+暴力)

我们直接从y开始枚举即可,第一个合法的就是答案。枚举次数不会太多,毕竟至少一个质数就ok了。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1000
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int p,y,ans=-1;
inline bool check(int x){
    for(int i=2;i<=p&&i*i<=x;++i)
        if(x%i==0) return 0;return 1;
}
int main(){
//  freopen("a.in","r",stdin);
    p=read();y=read();
    for(int i=y;i>p;--i)
        if(check(i)){ans=i;break;}
    printf("%d\n",ans);
    return 0;
}

CF936A Save Energy!(模拟)

模拟即可,注意细节。我们发现不是整数,就是x/2,所以也不用担心精度问题。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1000
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline ll read(){
    ll x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
ll k,d,t,ans=0;
int main(){
//  freopen("a.in","r",stdin);
    k=read();d=read();t=read();
    if(k%d==0){printf("%I64d",t);return 0;}
    d=(k/d+1)*d;t<<=1;ll x=d+k;
    ans=(t/x)*d;t%=x;
    if(t<=2*k){
        printf("%.2lf\n",(double)ans+t*0.5);return 0;
    }t-=2*k;ans+=k;printf("%I64d\n",ans+t);
    return 0;
}

CF936B Sleepy Game(图论+dfs)

题目大意:给定一张无向图和起点S,终点为出度为0的点,问是否存在一条路径满足从S到一个终点,且经过偶数个点。
首先我们一遍dfs染色,S颜色为0。如果有一个终点颜色为1,则满足条件,输出即可。
否则我们进行第二遍dfs,记录mark标记,表示这个点是否可以是另一种颜色(在第一遍染色的过程中,如果一个点颜色冲突,他就是可以变色的点)。如果有一个终点mark为1,可以变色,则满足条件,输出路径即可。(注意特判环的情况的路径)
如果还不行,说明赢不了了。我们看一下是否存在一个环,如果存在就可以draw,否则就会lose。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline char gc(){
    static char buf[1<<16],*S,*T;
    if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
    return *S++;
}
inline int read(){
    int x=0,f=1;char ch=gc();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
    return x*f;
}
int n,m,col[N],S,from[N],mfrom[N];
bool vis[N],mark[N],inq[N],cir=0;
vector<int>to[N],ed,ans;
inline void dfs(int x){
    vis[x]=1;
    for(int i=0;i<to[x].size();++i){
        int y=to[x][i];
        if(vis[y]){
            if(col[y]==col[x]^1) continue;
            mark[y]=1;mfrom[y]=x;
        }else col[y]=col[x]^1,from[y]=x,dfs(y);
    }
}
inline void dfs1(int x){
    vis[x]=1;
    for(int i=0;i<to[x].size();++i){
        int y=to[x][i];if(vis[y]) continue;
        if(mark[x]) mark[y]=1,mfrom[y]=x;dfs1(y);
    }
}
inline void findcir(int x){
    inq[x]=vis[x]=1;
    for(int i=0;i<to[x].size();++i){
        int y=to[x][i];
        if(vis[y]){
            if(inq[y]) cir=1;continue;
        }else findcir(y);
    }inq[x]=0;
}
int main(){
//  freopen("a.in","r",stdin);
    n=read();m=read();
    for(int x=1;x<=n;++x){
        int cnt=read();if(!cnt) ed.push_back(x);
        while(cnt--) to[x].push_back(read());
    }S=read();col[S]=0;dfs(S);
    for(int i=0;i<ed.size();++i){
        int x=ed[i];if(col[x]){
            puts("Win");while(x) ans.push_back(x),x=from[x];
            for(int j=ans.size()-1;j>=0;--j) printf("%d ",ans[j]);return 0;
        }
    }memset(vis,0,sizeof(vis));dfs1(S);memset(vis,0,sizeof(vis));
    for(int i=0;i<ed.size();++i){
        int x=ed[i];
        if(mark[x]){
            puts("Win");while(mfrom[x]){
                ans.push_back(x);vis[x]=1;x=mfrom[x];if(vis[x]) break;
            }
            while(x) ans.push_back(x),x=from[x];
            for(int j=ans.size()-1;j>=0;--j) printf("%d ",ans[j]);return 0;
        }
    }memset(vis,0,sizeof(vis));findcir(S);
    if(cir) puts("Draw");
    else puts("Lose");return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值