题目A:
题解:这是一道思维题,给你一个坐标(x,y),问你从原点到这个坐标最少需要多少步,每次可以上下左右或者在原地不动,相邻两次的操作不能相同,画个图,找找规律
就可以得到答案了。
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int x,y;
cin>>x>>y;
if(fabs(x-y)<=1)
{
cout<<x+y<<endl;
}
else
{
cout<<max(x,y)*2-1<<endl;
}
}
return 0;
}
题目B:
题解:题目大概意思是说给你n个盒子,每个盒子里放有一些积木,现在需要向盒子里加入一些积木,使任意一个盒子的积木拿出放到其他盒子里(可以拆成多份放入不同的盒子里),都有剩余的(n-1)个盒子的积木数量都相等;请输出最少需要放入多少个积木。
<1>用一个数组 md 记录每个盒子的积木数量,由于要求加入后对于每个盒子都满足题意,所以当积木数量最大的盒子(设积木数量为max)不是选择的盒子时,这是就要保证(n-1)盒子的积木数量大于等于max;这是一个边界状态,所以先将数组从小到大排序,最大的为md[n],最小的为md[1],由于积木数量最小,可假设增加的积木都放在md[1]上(之后将md[1]的所有积木分配到其他盒子里使(n-1)个盒子里积木数量相等),这时从2个盒子到n-1个盒子的数量都加到和md[n]相等,用sum记录一下,遍历一遍就得到了。
<2>这时会遇到两种情况,sum大于等于md[1]时,这时直接输出 sum-md[1] ;但是当sum小于md[1]时,这时我不用加积木已经能使剩余的盒子积木相等,而且还有多的,这些多的怎么处理,这时肯定是将剩余的积木平均分配到(n-1)个盒子里,如果不能平均加到能平均为止。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
int md[100005];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>md[i];
}
sort(md+1,md+1+n);//排序
long long sum=0;//注意这里的sum要用long long范围,不然int会爆掉
for(int i=2;i<n;i++)
{
sum+=md[n]-md[i];
}
if(sum>=md[1])
{
cout<<sum-md[1]<<endl;
}
else
{
md[1]-=sum;//剩余积木数量
int ans=0;
while(md[1]%(n-1)!=0)
{
md[1]++;//加到能平均分配为止
ans++;
}
cout<<ans<<endl;
}
}
return 0;
}
题目C:
题解:读完题后,肯定知道是用栈去做,开两个栈去分别存储"()"和"[]"。代码里有解释,不多说了。
#include<iostream>
#include<algorithm>
#include<string>
#include<stack>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
cin.ignore();
string s;
cin>>s;
int ans1=0,ans2=0;
stack<char> a1,a2;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(')//出现了'(',将其压入栈中
{
a1.push('(');
}
if(s[i]==')'&&!a1.empty()&&a1.top()=='(')//注意访问栈顶元素时,注意栈是否为空
{
ans1++;//当出现了')',而栈顶刚好有一个'(',这时可以匹配成功,ans加1;
a1.pop();//这时将栈顶的元素删除
}
if(s[i]=='[')
{
a2.push('[');
}
if(s[i]==']'&&!a2.empty()&&a2.top()=='[')
{
ans2++;
a2.pop();
}
}
cout<<ans1+ans2<<endl;
}
return 0;
}
题目D:
题解:有 n+2 个发射站,编号为 0 和 n+1 的发射站不能被接收信号,编号为 1~n 的发射站都可以发射信号,信号强度为 c 时,可以传送至编号为 [i-c,i+c] 的发射站上,但是每个发射站只能有一个信号,每个发射站无论信号强度是多少其有信号的概率是 1/2,求 1~n 都有信号的概率。输出概率mod上 998244353。
找一下规律,分母为2^n ,分子为斐波那契数列,答案为 f[n]/(2^n) mod 998244353,由此联想到费马小定理和快速幂。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 998244353
ll md[200005];
ll quick_pow(ll a,ll b)//快速幂
{
ll res=1;
while(b)
{
if(b&1)
res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
md[1]=md[2]=1;
for(int i=3;i<=n;i++)
{
md[i]=(md[i-1]+md[i-2])%mod;
}
ll ans=md[n]*quick_pow( quick_pow(2,n),mod-2)%mod;
cout<<ans<<endl;
return 0;
}