CodeForces - 991A
这个题画个文氏图就差不多了。
需要注意的地方就是数据可能会有逻辑错误。
1、这里可能会忘记除了自己其他人都可能是通过了的。
2、还有一个就是C必须小于A、B里最小的一个数才行。
#include <iostream> #include <algorithm> #include <cstring> #include <map> #include <string> #define MAXN 100007 typedef long long ll; using namespace std; int t, n; int main(){ int a,b,c,d; cin>>a>>b>>c>>d; if(d-(a-c)-(b-c)-c >=1 && c<=a&&c<=b) cout<<d-(a-c)-(b-c)-c<<endl; else cout<<"-1"<<endl; return 0; }
CodeForces - 991B
贪心问题。
对数据升序排列,然后将一个个最小的变成5进行判断。
该题数据量如果很大的话,可以使用二分进行优化。
但是鉴于这里数据只有100,直接暴力枚举就可以了。
#include <iostream> #include <algorithm> #include <cstring> #include <map> #include <string> #define MAXN 100007 typedef long long ll; using namespace std; int t, n; double a[107],ss=0; int main(){ cin>>n; for(int i =0;i<n;i++){ cin>>a[i]; ss+=a[i]; } if(ss/(1.0*n)>=4.5){ cout<<"0"<<endl; } else{ sort(a,a+n); for(int i =0;i<n;i++){ ss-=a[i]; ss+=5.0; if(ss/(1.0*n)>=4.5){ cout<<i+1<<endl; break; } } } return 0; }
CodeForces - 994C
模拟 + 二分
比赛的期间忘记了二分的方法,根本没有想起来。
#include <iostream> #include <algorithm> #include <cstring> #include <map> #include <string> #include <cstdio> #define MAXN 100007 typedef long long ll; using namespace std; ll n,l,r,i,m,ss,j,ans; int main(){ scanf("%lld",&n); l=1,r=n; while(l<r){ i=(l+r)/2; m=n; ss=0; while(m>0){ if(m>=i){ m-=i; ss+=i; } else{ ss+=m; m=0; } m-=(m/10); }
if(ss>=(n+1)/2){ ans=r=i; } else{ l=i+1; } } if(ans<1) ans=1; cout<<ans<<endl; return 0; }
CodeForces - 991D
直接遍历标记判断
#include <iostream> #include <algorithm> #include <cstring> #include <map> #include <string> #define MAXN 100007 typedef long long ll; using namespace std; int t, n; struct book{ int u,d; }g[MAXN]; char s1[MAXN],s2[MAXN]; int ans=0; map<int,int> m1,m2; int main(){ scanf("%s\n%s",s1,s2); for(int i =0;i<=strlen(s1);i++){ if(s1[i]=='0'&&s2[i]=='0'&&s2[i+1]=='0'&&!m1[i]&&!m2[i]&&!m2[i+1]){ m1[i]=1; m2[i]=1; m2[i+1]=1; ans++; } if(s2[i]=='0'&&s1[i]=='0'&&s1[i+1]=='0'&&!m2[i]&&!m1[i]&&!m1[i+1]){ m2[i]=1; m1[i]=1; m1[i+1]=1; ans++; } if(s1[i+1]=='0'&&s2[i]=='0'&&s2[i+1]=='0'&&!m1[i+1]&&!m2[i]&&!m2[i+1]){ m1[i+1]=1; m2[i]=1; m2[i+1]=1; ans++; } if(s2[i+1]=='0'&&s1[i]=='0'&&s1[i+1]=='0'&&!m2[i+1]&&!m1[i]&&!m1[i+1]){ m2[i+1]=1; m1[i]=1; m1[i+1]=1; ans++; } } cout<<ans<<endl; return 0; }