Gym 101972

时间:2021-12-15 16:14:26

Gym 101972

F读错题wa了三个小时。自闭了,不然I题有可能能出的。。已经想到组合数也敲完组合数板子了。

A:这。。。**题吧,第一眼看的这个就秒了

 #include<bits/stdc++.h>
#define pii pair<int,int>
#define mk(a,b) make_pair(a,b)
using namespace std;
typedef long long ll;
int a[],b[];
void slove(int n,int id){
if(id==) {
int k = ;
while (n) {
k++;
a[k] = n % ;
a[k]*=pow(,k-);
n /= ;
}
} else{
int k = ;
while (n) {
k++;
b[k] = n % ;
b[k]*=pow(,k-);
n /= ;
}
}
}
int t,x,y;
vector<pii>ans;
int main(){
ios::sync_with_stdio(false);
cin>>t;
while (t--){
memset(a,, sizeof(a));
memset(b,, sizeof(b));
ans.clear();
cin>>x>>y;
slove(x,);
slove(y,);
for(int i=;i<=;i++){
if(a[i]==)
continue;
for(int j=;j<=;j++){
if(b[j]==)
continue;
ans.push_back(mk(a[i],b[j]));
}
}
for(int i=;i<ans.size();i++){
if(i==ans.size()-){
cout<<ans[i].first<<" x "<<ans[i].second<<endl;
} else{
cout<<ans[i].first<<" x "<<ans[i].second<<" + ";
}
}
}
}

B: 这篇写的很好  https://blog.csdn.net/lzc504603913/article/details/83863102

有几个关键的性质一定要注意到。

如果一个点有两颗儿子,那么这个点的祖先全部没有答案。

如果一个点有三个及以上儿子,这个点及这个点的祖先全部没有答案。

如果一个点没答案,他的所有祖先全没答案。

那么我们可以把点分为三类。1.没答案的 2. 一条链的 3. 两条链的(也就是这个点有两个儿子,然后这两个儿子是两条链,不然没答案嘛)

然后我们考虑题目要求满足的条件。

唔...那篇说的太好了我目前还想不到其他更好的表达方式了。。。复述一遍没有多大意义,请移步去看上面那个链接吧。

(我懒得敲等式什么的(大雾))

C:又卡cin。。。小学数学题

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
double a,b,c,x;
int main(){
//ios::sync_with_stdio(false);
scanf("%d",&t);
while (t--){
scanf("%lf%lf%lf%lf",&a,&b,&c,&x);
double ans = ;
ans+=sqrt(a*a+(b+c+c)*(b+c+c));
x/=;
ans += sqrt(b*b+a*a)*x;
ans+=sqrt((c+c+b*(1.0-x))*(c+c+b*(1.0-x))+a*(1.0-x)*a*(1.0-x));
printf("%.10f\n",ans);
}
}

D:**

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,n,x,y;
int main(){
ios::sync_with_stdio(false);
cin>>t;
while (t--){
cin>>n>>x>>y;
if(n%==){
if(x>=n/&&y>=n/)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
} else{
if(y>=n/&&x>=n/+)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
}

E:我做的很麻烦,可以不开那个数组,直接记录当前已知的最大测试数据就行

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,k,n,m;
char c[];
int vis[];
void slove(int st,int en){
for(int i=st;i<=en;i++)
vis[i]=(c[i]=='S');
}
int main(){
ios::sync_with_stdio(false);
cin>>t;
while (t--){
memset(vis,, sizeof(vis));
memset(c,, sizeof(c));
cin>>n>>m>>k;
for(int i=;i<=n;i++)
cin>>c[i];
int mx = k;
slove(,mx);
int ans = ;
char op;int x;
while (m--){
cin>>op;
if(op=='A'){
slove(mx+,n);
mx = n;
} else{
cin>>x;
if(x>mx){
slove(mx+,x);
mx = x;
} else{
if(vis[x])
ans++;
}
}
}
cout<<ans<<endl;
}
}

F:我以为必须要全部用完,也就是“恰好”才可以。。。******************

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[],t,s1,s2,minn,ans,sum;
int main() {
ios::sync_with_stdio(false);
cin>>t;
while(t--) {
minn=1e12;
ans=s1=s2=sum=;
for(int i=;i<=;i++) {
cin>>a[i];
if(a[i]==)s1++;
if(a[i]>=) {
s2++;
minn=min(a[i]/,minn);
}
}
ans=s2*;
if(s1>) {
ans++;
sum=min(minn,s1);
}
else
sum=minn;
if(minn==1e12)sum=s1;
cout<<ans<<' '<<sum<<endl;
}
return ;
}

G:从四个角分别维护一下然后枚举删掉的行列

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,n,m;
int a[][];
int plu[][];
int pru[][];
int pld[][];
int prd[][];
void init(){
memset(plu,, sizeof(plu));
memset(pru,, sizeof(pru));
memset(pld,, sizeof(pld));
memset(prd,, sizeof(prd));
memset(a,, sizeof(a));
}
int main(){
ios::sync_with_stdio(false);
cin>>t;
while (t--) {
init();
cin >> n >> m;
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
cin >> a[i][j];
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
plu[i][j]=max(max(plu[i-][j],plu[i][j-]),a[i][j]);
}
}
for(int i=;i<=n;i++){
for(int j=m;j>=;j--){
pru[i][j]=max(max(pru[i][j+],pru[i-][j]),a[i][j]);
}
}
for(int i=n;i>=;i--){
for(int j=;j<=m;j++){
pld[i][j]=max(max(pld[i+][j],pld[i][j-]),a[i][j]);
}
}
for(int i=n;i>=;i--){
for(int j=m;j>=;j--){
prd[i][j]=max(max(prd[i+][j],prd[i][j+]),a[i][j]);
}
}
int ans = 1e9+;
for(int i=;i<n;i++){
for(int j=;j<m;j++){
ans = min(ans,max(max(max(plu[i-][j-],prd[i+][j+]),pru[i-][j+]),pld[i+][j-])-min(min(min(plu[i-][j-],prd[i+][j+]),pru[i-][j+]),pld[i+][j-]));
}
}
cout<<ans<<endl;
}
}

H:暴力统计出来所有的字母对就行。我是直接维护个前缀

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,n,m,k;
string a,b;
int pre[];
int cnt[][];
int vis[][];
int main(){
ios::sync_with_stdio(false);
cin>>t;
while (t--){
cin>>n>>m>>k>>a>>b;
a="*"+a;b="*"+b;
memset(pre,, sizeof(pre));
memset(cnt,, sizeof(cnt));
memset(vis,, sizeof(vis));
for(int i=;i<=m;i++){
pre[b[i]-'a']=pre[b[i]-'a']+;
for(int j=;j<;j++){
cnt[b[i]-'a'][j]+=pre[j];
}
}
int l=,r=k;
ll ans = ;
while (r<=n){
if(vis[a[r]-'a'][a[l]-'a']){}
else
ans+=cnt[a[r]-'a'][a[l]-'a'],vis[a[r]-'a'][a[l]-'a']=;
l++,r++;
}
cout<<ans<<endl;
}
}

I:锁的方案数猜也能猜出来。。。

考虑 任选 m-1 个人,有C(n,m-1)种方案,每种方案都打不开,也就是都有至少一把锁是打不开的,所以锁最少是C(n,m-1)种。

对于钥匙,考虑先拿出来一个人,然后在n-1个人里选m-1个人,有C(n-1,m-1)种方案数,对于每种方案数,这个人都要有对应的钥匙,所以就是C(n-1,m-1)种方案数

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 1e9+;
ll up[],inv[],down[];//down就是分子(分母*乘法逆元
void init(){
up[]=;
for(int i=;i<=;i++){
up[i]=up[i-]*i % mod;
}
inv[]=;//乘法逆元板纸,其实我也不懂...
for(int i=;i<=;i++){
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
down[]=;
for(int i=;i<=;i++){
down[i]=down[i-]*inv[i]%mod;
}
}
ll C(ll x,ll y){//组合数(逃...
return up[x]*down[y]%mod*down[x-y]%mod;
}
int t;
ll n,m;
int main(){
ios::sync_with_stdio(false);
init();
cin>>t;
while (t--){
cin>>n>>m;
cout<<C(n,m-)<<" "<<C(n-,m-)<<endl;
}
}

J:遇见过,hdu上的好像是,问你杨辉三角第n行奇数的个数,这个是有规律的,一百度啥都有,就直接秒了

那个,,你要是看不出来这公式就是组合数就当我啥都没说。。。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
ll n;
int main(){
ios::sync_with_stdio(false);
cin>>t;
while (t--){
cin>>n;
int num = ;
ll tmp = n;
while (n){
if(n&)
num++;
n>>=;
}
cout<<((tmp+)-(1ll<<num))<<endl;
}
}

K:一开始又看错了感觉奇难无比,但是A题那么**的题竟然人数跟K差不多,就重新看了下,,发现他这个只能按照顺序平移一位。。。

我一开始看成只要是能组成一个环就可以。。。然后头痛欲裂。。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int na[],nb[];
int t;
string a,b;
int main(){
ios::sync_with_stdio(false);
cin>>t;
while (t--){
memset(na,, sizeof(na));
memset(nb,, sizeof(nb));
int x;cin>>x;
cin>>a>>b;
string aa="",bb="";
for(int i=;i<x;i++){
if(a[i]!=b[i]){
aa+=a[i];
bb+=b[i];
}
}
int n = aa.length();
int flag = ;
for(int i=;i<n;i++){
if(aa[i]!=bb[i-]) {
flag = ;
break;
}
}
if(aa[]!=bb[n-])
flag = ;
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}

这个B题感觉有点硬核,主要是我也没去想B题咋做。除此之外失误太多了。理论10题实际8题。。。另外3星场水题也太多了。。。说实话我们出的新生赛的那些水题都比大多数的三星场难很多。。。

滚回宿舍了。明天下午尽量快点做完计组实验然后去新生赛现场凑热闹嘿嘿嘿。