AtCoder-ABC-171题解(A~E)

AtCoder-ABC-171题解(A~E)

A-αlphabet

题意:

小写字母输出a,大写字母输出A。

思路:

直接做即可。

Code:

int main(){
	char c;
	cin>>c;
	if(c>='A'&&c<='Z'){
		cout<<"A";
	}
	else cout<<"a";
}

B- Mix Juice

题意:

给一个长度为N的数组,要求选K个数,求选的K个数的和的最小值。 N , K < = 1000 N,K<=1000 N,K<=1000

思路:

排序贪心直接做。

Code:

int q[N];
char s[N];
map<int,int>mp,vis;
int main(){
	int n;
	n=read();
	int k;
	k=read();
	rep(i,1,n){
		q[i]=read();
	}
	sort(q+1,q+1+n);
	int sum=0;
	rep(i,1,k){
		sum+=q[i];
	}
	cout<<sum;
}

C-One Quadrillion and One Dalmatians

题意:

有若干条小狗,第 1 1 1个小狗名字是 a a a,第 2 2 2个是 b b b,第27个是 a a aa aa…第 702 702 702个是 z z zz zz,询问第 N N N条小狗的名字是什么。 1 ≤ N ≤ 1000000000000001 1≤N≤1000000000000001 1N1000000000000001

思路:

通过题意不难发现,小狗的编号等于小狗的名字在非严格二十六进制下的转换。用第 702 702 702条小狗举例子,即 ( s [ 1 ] − a + 1 ) ∗ 26 + ( s [ 2 ] − a + 1 ) = 26 ∗ 26 + 26 = 676 + 26 = 702 (s[1]-a+1)*26+(s[2]-a+1)=26*26+26=676+26=702 (s[1]a+1)26+(s[2]a+1)=2626+26=676+26=702 。可以发现每一项的系数可以达到 26 26 26,所以并不是严格意义上的 26 26 26进制。所以我们在每一次处理余数前,对 N N N − 1 -1 1即可解决非严格进制的问题。

Code:

int q[N];
map<int,int>mp,vis;
string s="abcdefghijklmnopqrstuvwxyz";
int main(){
    ll n;
    n=read();
    string ans;
    while(n){
        n--;//每一次求余数前的处理
        ans+=s[n%26];
        n/=26;
    }
    reverse(ans.begin(),ans.end());//翻转输出
    cout<<ans;
    return 0;
}

D - Replacing

题意:

给定一个长度为 N N N的数组 A 1 , A 2 . . . A n A_1,A_2...A_n A1,A2...An。执行 Q Q Q次操作,每次操作给定两个数 B i , C i B_i ,C_i Bi,Ci,即将 A A A数组中所有的 B i Bi Bi值全部换为 C i Ci Ci.要求输出每次操作后 A A A数组的权值和。

思路:

输入时预处理拿桶预处理一下每个数出现的次数和前缀和 s u m sum sum,每次操作后维护 s u m sum sum和桶,模拟即可,注意会爆 i n t int int

Code:

ll q[N];
map<ll,ll>mp,vis;
int main(){
	int n;
	n=read();
	ll sum=0;
	rep(i,1,n){
		q[i]=read();
		mp[q[i]]++;//维护桶
		sum+=q[i];//维护前缀和
	}
	int m;
	m=read();
	ll l,r;
	rep(i,1,m){
		scanll2(l,r);
		sum-=mp[l]*l;//维护前缀和
		mp[r]+=mp[l];//维护桶
		sum+=mp[l]*r;//维护前缀和
		cout<<sum<<endl;
		mp[l]=0;//维护桶

	}
	return 0;	
}

E-Red Scarf

题意:

N N N只猫,每一只猫拥有两种数字,第 i i i只猫手里掌握着数字 a i a_i ai,定义每一只猫手里的数字 a i = ( b 1 ⊕ b 2 ⊕ . . . ⊕ b i − 1 ⊕ b i + 1 ⊕ b i + 2 ⊕ . . . ⊕ b n ) a_i=(b_1 \oplus b_2 \oplus... \oplus b_{i-1}\oplus b_{i+1} \oplus b_{i+2}\oplus...\oplus b_n) ai=(b1b2...bi1bi+1bi+2...bn)。给出数组 a a a,要求输出数组 b b b 2 ≤ N ≤ 200000 2≤N≤200000 2N200000 N N N是偶数。

思路:

观察可得,
( a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . ⊕ a n ) = ( b 1 ⊕ . . . ⊕ b 1 ) ⏟ n − 1 个 ⊕ . . . ⊕ ( b n ⊕ . . . ⊕ b n ) ⏟ n − 1 个 = ( b 1 ⊕ . . . ⊕ b n ) (a_1 \oplus a_2 \oplus a_3 \oplus...\oplus a_n)=\begin{matrix} \underbrace{ (b_1 \oplus ...\oplus b_1) } \\ n-1个 \end{matrix} \oplus ...\oplus \begin{matrix} \underbrace{ (b_n \oplus ...\oplus b_n) } \\ n-1个 \end{matrix}=(b_1 \oplus ...\oplus b_n) (a1a2a3...an)= (b1...b1)n1... (bn...bn)n1=(b1...bn)

由题意可得, b i = ( b 1 ⊕ . . . ⊕ b n ) ⊕ a i b_i=(b_1 \oplus ...\oplus b_n) \oplus a_i bi=(b1...bn)ai
b i = ( a 1 ⊕ a 2 ⊕ a 3 ⊕ . . . ⊕ a n ) ⊕ a i b_i=(a_1 \oplus a_2 \oplus a_3 \oplus...\oplus a_n) \oplus a_i bi=(a1a2a3...an)ai

求出 a a a数组的异或前缀和,运用推导出的结论即可。

Code:

int q[N];
int main(){
    int n;
    n=read();
    rep(i,1,n){
        q[i]=read();
    }
    ll sum=q[1];
    rep(i,2,n){
        sum^=q[i];//异或前缀和
    }
    rep(i,1,n){
        cout<<(sum^q[i])<<" ";//公式
    }
    return 0;
}

F-Strivore

待补

你可能感兴趣的:(ACM,AtCoder)