计蒜客普及组模拟赛
今天没事闲的看到计蒜客有个普及组模拟赛,就当练了练手去打了,成绩低的可怜。。。400分崩成280分AK梦想化作泡影
第一题 同学的爱好 链接:https://nanti.jisuanke.com/t/17291
小学应用题难度?大概画个图就能懂,把每个部分都标上号,算出a,b,c,d,e,f的部分,进行运算就行了。
不多解释了,直接上代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int a,b,c,d,e,f,n; int main(){ cin>>n; cin>>a>>b>>c>>d>>e>>f; int x=0,y=0; y=d+e+f; x=a+b+c-n; int ans=0; ans=y-x; cout<<ans; return 0; }
第二题 选秀 链接:https://nanti.jisuanke.com/t/17292
直接从0到1001进行模拟,但是注意魅力值可以是实数,所以有小数可以得到票的情况,开两个数组进行比较(感觉有点多余啊)。最后扫一遍比较最多的票数。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int a[1005],b[1005]; int n,ans,x; char q[5]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s%d",q,&x); if(q[0]=='='){a[x]++;b[x]++;} if(q[0]=='>'&&q[1]!='='){ for(int k=x+1;k<=1001;k++){a[k]++;b[k-1]++;} } if(q[0]=='>'&&q[1]=='='){ for(int k=x;k<=1001;k++){a[k]++;b[k]++;} } if(q[0]=='<'&&q[1]!='='){ for(int k=x-1;k>=0;k--){a[k]++;b[k]++;} } if(q[0]=='<'&&q[1]=='='){ for(int k=x;k>=0;k--){a[k]++;b[k]++;} } } for(int i=0;i<=1001;i++){ ans=max(ans,max(a[i],b[i])); } cout<<ans; return 0; }
第三题 摘气球 链接:https://nanti.jisuanke.com/t/17293l
排序之后模拟,这题本来a掉的,死在排序气球高度以n长度去排序的。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; struct child{ int x,y; }c[100005]; int n,m; int a[100005],b[100005]; bool cmp(child a,child b){ return a.x<b.x; } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&c[i].x); c[i].y=i; } int x; int k=1; for(int i=1;i<=m;i++){ scanf("%d",&b[i]); } sort(c+1,c+n+1,cmp); sort(b+1,b+m+1); for(int i=1;i<=m;i++){ for(k;k<=n;){ if(c[k].x>=b[i]){ a[c[k].y]++; break; } else k++; } } for(int i=1;i<=n;i++){ cout<<a[i]<<endl; } return 0; }
第四题 蒜头君当大厨 链接 :https://nanti.jisuanke.com/t/17294
差分约束(为什么普及组模拟赛要有差分约束啊,话说我前几天才刚看的)
SPFA跑一遍最长路,死于边数开太小re三个点
#include<bits/stdc++.h> #define MAXN 100002 using namespace std; int read() { int x=0,y=1;char c;c=getchar(); while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*y; } struct Edge{ int other,pre,val; }a[MAXN]; int N,M,cnt,last[MAXN],dis[MAXN],in[MAXN],ans; bool vis[MAXN]; void connect(int x,int y,int z) { a[++cnt]=(Edge){y,last[x],z}; last[x]=cnt; } bool SPFA() { queue <int> q; memset(dis,0xef,sizeof dis); vis[0]=1,dis[0]=0,in[0]++; q.push(0); while(!q.empty()) { int x=q.front(); q.pop();vis[x]=false; for(int i=last[x];i;i=a[i].pre) { int to=a[i].other; if(dis[to]<dis[x]+a[i].val) { dis[to]=dis[x]+a[i].val; if(!vis[to]) { vis[to]=true; in[to]++; q.push(to); if(in[to]>N)return false; } } } } return true; } int main() { N=read(),M=read(); for(int i=1;i<=M;i++) { int op,x,y,z; op=read(); x=read(),y=read(); if(op<3) { z=read(); if(op==2)swap(x,y); connect(x,y,z); } else if(op==3) connect(0,x,y); else if(op==4) connect(x,0,-y); } for(int i=1;i<=N;++i) connect(0,i,0); if(SPFA()){ for(int i=1;i<=N;i++)ans=max(ans,dis[i]); cout<<ans<<endl; } else cout<<"I can't"<<endl; return 0; }