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;
}