1,A. AB Balance-Educational Codeforces Round 116 (Rated for Div. 2)
题意:给出有a,b组成的字符串s。可以对s进行操作,每次选取一个位置,可以使该位置的字符变为a或b。
要求用最少的操作将字符中ab(string)和ba(string)的的数量相等。
题解:判断第一个字符和最后一个字符是否相等,如果相等则输出,如果不想等将最后一个字符变为第一个字符然后输出。
#include<iostream>
#include<string>
using namespace std;
string x,y;
int n,m,flag1;
int i1,i2,i3,i4,i5;
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> x;n=x.size();
flag1=0;
for(i1=0;i1<n;i1++)
{
if(i1!=0&&x[i1]!=x[i1-1]) flag1=1;
}
if(x[0]==x[n-1]) cout <<x<< endl;
else {x[n-1]=x[0];cout << x << endl;}
}
return 0;
}
解释:如果aaabaa,那ab和ba数量相等,只有在最后一个字符和第一个字符不相等的时候才会出现一个的差距。
2,B. Update Files-Educational Codeforces Round 116 (Rated for Div. 2)
题意:有n台计算机k条数据线。一条数据线只能同时连接两台电脑,每台计算机同一时间只能插入一条数据线。最初只有一台电脑有数据,要求将所有电脑都考上数据。
题解,建立数组a,a中是2的所有幂(包括零次幂,下标从零开始)。算出k小于a的几次幂,所得结果计为m。
如果a的m次幂等于n,直接输出。如果a的m次幂小于n,将多余的部分除以k加上m,输出。如果小于n,再进行一次比较,算出n小于a的多少次幂。
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<map>
#include<cstring>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define ll long long
ll n,m,k,p;
ll i1,i2,i3,i4,i5,i6,i7;
ll a[40000];
int main()
{
i2=1;a[1]=1;
for(i1=2;;i1++)
{i2=i2<<1;
a[i1]=i2;
if(i2>1e18) break;
}
int t;
cin >> t;
while(t--)
{
cin >> n>>k;
int flag=0;
if(n==1) {cout <<0<< endl;continue;}
m=1;
while(1)
{
if(n<=a[m+1]) {cout<<m<<endl;flag=1;break;}
if(k<a[m+1]) break;
if(i1==m+1) break;
m++;
}
if(flag==1) continue;
if(a[m+1]==n) {cout<<m<<endl;continue;}
if(a[m+1]<n) {
n=n-a[m+1];
m=m+(n-1)/k+1;
cout<<m<<endl;continue;
}
}
return 0;
}
解释,每次可以用的数据线为a的i次幂,因为每次操作完有数据的电脑成指数上升。(自己画个图,验算一下,数学题,很难用语言来描述。)
3,C. Banknotes-Educational Codeforces Round 116 (Rated for Div. 2)
题意:给定n中面额的纸币,要求给出一个金额数量使得使用k张钞票不能构成,而且是不能构成的金额数量最低。
题解:直接看代码吧,如果看不懂就看代码低下的解释。
#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<map>
#include<cstring>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define ll long long
ll n,m,num;
ll i1,i2,i3,i4,i5,i6,i7;
ll a[20];
ll pow1(ll n)
{
ll i1,i2=1;
for(i1=1;i1<=n;i1++)
i2*=10;
return i2;
}
int main()
{
int t;
cin >> t;
while(t--)
{num=0;
cin >> n>>m;
m=m+1;
for(i1=1;i1<=n;i1++) cin >> a[i1];
for(i1=1;i1<n;i1++)
{
if(m>=pow1(a[i1+1]-a[i1])-1)
{
num+=(pow1(a[i1+1]-a[i1])-1)*pow1(a[i1]);
m-=pow1(a[i1+1]-a[i1])-1;
}
else {
num+=m*pow1(a[i1]);
break;
}
}
if(i1==n)
num+=m*pow1(a[n]);
cout <<num << endl;
}
return 0;
}
解释:首先m++是最好的判断k张钞票不能够构成的金额。如果面额i不存在,那需要用上一张面额的10倍来构成一张这种面额。拿出九张面额为i的钞票加上之前的钞票就可以构成截止到当前面额i最大的值了。
注意:,以后Codeforces上的题就写的少了d(ŐдŐ๑),但是会写一写洛谷上的题。ヽ(≧Д≦)ノ