题目链接:Educational Codeforces Round 98 (Rated for Div. 2)
A. Robot Program
贪心
int main()
{
int t;
cin >> t;
while(t--)
{
int x,y;
cin >> x >> y;
if(fabs(x-y)<=1)
{
cout << x+y << endl;
continue;
}
else
{
cout << (min(x,y)*2+1)+(max(x,y)-min(x,y)-1)*2 << endl;
}
}
}
B. Toy Blocks
没想到B比C还难。。。
可以分析出满足这两种条件即可满足题意。
设sum为原数组的总和,cnt为extra blocks数量,maxx为块中最大值。
- (sum+cnt)%(n-1)==0
- (sum+cnt)/(n-1)>=maxx
所以我们只需寻找满足这两种情况的最小cnt即可。
ll a[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n; scanf("%lld",&n);
ll sum=0,maxx=-1;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
maxx=max(maxx,a[i]);
}
ll cnt=(n-1)-sum%(n-1);
if(cnt==(n-1)) cnt=0;
if((sum+cnt)/(n-1)>=maxx)
{
cout << cnt << endl;
continue;
}
cnt=cnt+(n-1)*(maxx-(sum+cnt)/(n-1));
cout << cnt << endl;
}
}
C. Two Brackets
很经典的括号匹配问题
stack<char> sta1,sta2;
int main()
{
int t;
cin >> t;
while (t--) {
while(!sta1.empty()) sta1.pop();
while(!sta2.empty()) sta2.pop();
string s;
cin >> s;
int num=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='[') sta1.push(s[i]);
if(s[i]=='(') sta2.push(s[i]);
if(s[i]==']')
{
if(!sta1.empty())
{
if(sta1.top()=='[')
{
sta1.pop();
num++;
}
}
}
if(s[i]==')')
{
if(!sta2.empty())
{
if(sta2.top()=='(')
{
sta2.pop();
num++;
}
}
}
}
cout << num << endl;
}
}
D. Radio Towers
找规律,逆元求解。但为啥比赛就没找到呢 >.<。
分母很明显就是
2
n
{2^n}
2n,分子就是符合条件的个数。
设f[n]:n个城镇时,放置信号灯满足条件的种类数。
f[1]:1
f[2]:1
f[3]:2
f[4]:3
f[5]:5
很明显斐波那契数列。
所以
a
n
s
=
f
[
n
]
∗
i
n
v
(
2
n
)
{ans=f[n]*inv(2^n) }
ans=f[n]∗inv(2n),由于取模为质数,费马小定理求解即可。
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return (ans+mod)%mod;
}
ll inv(ll a) { return qpow(a,mod-2); }
ll f[maxn];
int main()
{
f[1]=f[2]=1;
for(int i=3;i<=200000;i++) f[i]=(f[i-1]+f[i-2])%mod;
ll n;
cin >> n;
cout << (f[n]*inv(qpow(2,n))%mod+mod)%mod;
}