郑州大学第六场萌新联赛,题目有点难,有兴趣可以写一下这里
C-报数_
找规律,结果都等于1
cout<<"1"<<endl;
G-找不同
直接判断每个字符是否相等
void solve()
{
int n; cin>>n;
string a; cin>>a;
bool ok=false;
for(int i=0;i<a.size();i++){
for(int j=i+1;j<a.size();j++){
if(a[i]!=a[j])
{
cout<<i<<" "<<j<<endl;
ok=true;
break;
}
}
if(ok)
break;
}
if(!ok)
cout<<"-1"<<endl;
//cout<<fixed<<setprecision(k);
}
J-空调_
这道题我们需要考虑的东西有很多,模式从开头到结束,再从结束到开头,温度到开头和结束的时候,再按温度也不会变,感觉很复杂,但是如果仔细查看可以发现其中规律。首先我们要把模式和温度差值算出来,模式就是m-1,温度就是abs(t-26)。如果n<两者相加,那么肯定说谎。接下来在判断>=内的情况,c=除去需要的还剩下的步骤。我们可以把他们放在温度和模式上,如果c%2==0说明我们可以在温度上加一度再减一度,结果不变;如果t等于左边界或者右边界,那么可以一直加或者一直减,温度不会变;如果温度与边界的两倍差值小于c那么可以先走到边界,再消耗多余的步骤,最后再返回原来的位置,结果依旧不会变;这样就可能会实现。最后如果c小于模式的总数;或者模式的总数为偶数(c=2x+ ky,c大于模式的总数,我们需要若干个2和若干个k,2*x是偶数,如果k是偶数,那么c怎么都不可能是奇数,而k是奇数,则c无论是什么都能实现)则说明说谎,其余情况的都有可能实现。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<ll,ll>
#define fi first
#define se second
const ll N=1e6+6;
const int mod=1e9+7;
//ll a[N],b[N];
void solve()
{
int l,r,k,n,t,m;
cin>>l>>r>>k>>n>>t>>m;
int cntm=0,cntt=0;
cntm=m-1,cntt=llabs(t-26);
if(n<cntm+cntt)//第一轮都不够的
{
cout<<"Lie"<<endl;
return;
}
int c=n-cntm-cntt;
if(c%2==0||t==l||t==r||c+cntt>=r-26+(r-t)||c+cntt>=26-l+t-l)//需要消耗的,自我能消耗完的
{
cout<<"Maybe"<<endl;
return;
}
if(c<k||k%2==0)//剩下的怎么都不能完全消耗
{
cout<<"Lie"<<endl;
return;
}
cout<<"Maybe"<<endl;//其余情况
//cout<<fixed<<setprecision(k);
}
signed main()
{
IOS
ll PPP=1;
cin>>PPP;
while(PPP--)
solve();
return 0;
}
D-垂直电梯_
这道题我们知道总费用为(k*m-a+b)我们要减少换乘的次数才能减少总费用,接着可以看出从a到b,分两种情况,第一种:两趟,a和b的最大公因数大于1,所以就先从a-1层坐电梯到1层,再从1层坐电梯到b-1层。第二种:a和b的最小公倍数小于等于n,所以直接到达b层。不会有第三种无解的情况,自然不用考虑"No Solution"。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<ll,ll>
#define fi first
#define se second
const ll N=1e6+6;
const int mod=1e9+7;
//ll a[N],b[N];
int lcm(int a,int b)
{
return a*b/__gcd(a,b);
}
void solve()
{
int n,m,a,b;
cin>>n>>m>>a>>b;
if(__gcd(a,b)>1||lcm(a,b)<=n)
cout<<m+b-a<<endl;
else cout<<m+b-a+m<<endl;
//cout<<fixed<<setprecision(k);
}
signed main()
{
IOS
ll PPP=1;
cin>>PPP;
while(PPP--)
solve();
return 0;
}
B-果树_
这道题我们举例可以看出,区间两端下标都为偶数或奇数,则换不换都一样,如果去见两段一个奇数一个偶数,则可以换,取最大值。接着就用最大子序列来更新最大值。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<ll,ll>
#define fi first
#define se second
const ll N=2e5+6;
const int mod=1e9+7;
//ll a[N],b[N];
int a[N];
vector<int> v1,v2;
void solve()
{
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int sum=0;
v1.clear(),v2.clear();
for(int i=0;i<n;i+=2) sum+=a[i];
for(int i=0;i+1<n;i+=2)
v1.push_back(a[i+1]-a[i]);
for(int i=1;i+1<n;i+=2)
v2.push_back(a[i]-a[i+1]);
int sum1=0,sum2=0,ans1=0,ans2=0;
for(int i=0;i<v1.size();i++)
{
sum1=max(v1[i],sum1+v1[i]);
ans1=max(sum1,ans1);
}
for(int i=0;i<v2.size();i++)
{
sum2=max(v2[i],sum2+v2[i]);
ans2=max(ans2,sum2);
}
cout<<sum+max({0LL,ans1,ans2})<<endl;
//cout<<fixed<<setprecision(k);
}
signed main()
{
IOS
ll PPP=1;
//cin>>PPP;
while(PPP--)
solve();
return 0;
}
L-神秘数字
每个数字的二进制一所在的位置都不一样,所以m组一共有2m个。那么我们就用二进制来算,通过二进制来算出共有m组,说明n个数转换成二进制最多有m位。然后我们看1的位置和多少来评判这个数能不能找到。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<ll,ll>
#define fi first
#define se second
const ll N=2e5+6;
const int mod=1e9+7;
//ll a[N],b[N];
int n;
vector<int> ans[50];
void solve1(int m)
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
{
if(j&(1<<i))//i向左移一位与j并比较
ans[i+1].push_back(j+1);//+1是为了方便输出
}
}
void solve()
{
cin>>n;
int m=1;
while((1<<m)<n) m++;//m向左一位,算n个数二进制最大有多少位
solve1(m);
cout<<m<<endl;
for(int i=1;i<=m;i++)//遍历输出
{
cout<<ans[i].size();
for(int x:ans[i])
cout<<" "<<x;
cout<<endl;
}
//cout<<fixed<<setprecision(k);
}
signed main()
{
IOS
ll PPP=1;
//cin>>PPP;
while(PPP--)
solve();
return 0;
}
I-耳鸣_
由于我们知道在什么位置耳鸣,来算距离,不如把位置当做圆心,距离当做半径,来求圆的面积(即:圆上有多少个位置),把每个点的圆的位置累加就可以了。接下来就要开始每个位置遍历了,由于距离为a,那么我们圆的半径就为a,x-a~x+a为每行的距离,遍历每个x来确定y,根据两点坐标公式可以算出y方向上的距离, 而y-len~y+len为每列的距离,但后我们就开始算差分来维护行区间。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<ll,ll>
#define fi first
#define se second
// const ll N=2e5+6;
// const int mod=1e9+7;
//ll a[N],b[N];
void solve()
{
int n,m,a,q;
cin>>n>>m>>a>>q;
vector<int> diff(n*m+5,0);
for(int i=1;i<=q;i++)
{
int x,y;
cin>>x>>y;
for(int j=max(1ll,x-a);j<=min(n,x+a);j++)
{
int sheng=a*a-(x-j)*(x-j);//两点距离公式
int len=(int)sqrt(sheng);
while((len+1)*(len+1)<=sheng)
len++;
int l=max(1ll,y-len),r=min(m,y+len);
//差分维护行间距
diff[(j-1)*m+l]+=1;//前j-1行+l的位置+1;
diff[(j-1)*m+r+1]-=1;//前j-1行+r+1的位置-1;
//这样两下可以消掉,如果没有消掉,说明在耳鸣区间内
}
}
int ans=0,k=0;
for(int i=1;i<=n*m;i++)
{
k+=diff[i];
if(k!=0)
ans++;
}
cout<<ans<<endl;
//cout<<fixed<<setprecision(k);
}
signed main()
{
IOS
ll PPP=1;
//cin>>PPP;
while(PPP--)
solve();
return 0;
}