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\)

思路:

排序贪心直接做。

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\)个小狗名字是\(a\),第\(2\)个是\(b\),第27个是\(aa\).....第\(702\)个是\(zz\),询问第\(N\)条小狗的名字是什么。\(1≤N≤1000000000000001\)

思路:

通过题意不难发现,小狗的编号等于小狗的名字在非严格二十六进制下的转换。用第\(702\)条小狗举例子,即\((s[1]-a+1)*26+(s[2]-a+1)=26*26+26=676+26=702\) 。可以发现每一项的系数可以达到\(26\),所以并不是严格意义上的\(26\)进制。所以我们在每一次处理余数前,对\(N\)\(-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\)的数组\(A_1,A_2...A_n\)。执行\(Q\)次操作,每次操作给定两个数\(B_i ,C_i\),即将\(A\)数组中所有的\(Bi\)值全部换为\(Ci\).要求输出每次操作后\(A\)数组的权值和。

思路:

输入时预处理拿桶预处理一下每个数出现的次数和前缀和\(sum\),每次操作后维护\(sum\)和桶,模拟即可,注意会爆\(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\)只猫,每一只猫拥有两种数字,第\(i\)只猫手里掌握着数字\(a_i\),定义每一只猫手里的数字\(a_i=(b_1 \oplus b_2 \oplus... \oplus b_{i-1}\oplus b_{i+1} \oplus b_{i+2}\oplus...\oplus b_n)\)。给出数组\(a\),要求输出数组\(b\)\(2≤N≤200000\) \(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)\)

由题意可得,\(b_i=(b_1 \oplus ...\oplus b_n) \oplus a_i\)
\(b_i=(a_1 \oplus a_2 \oplus a_3 \oplus...\oplus a_n) \oplus a_i\)

求出\(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

待补

posted @ 2020-06-24 21:52  Qquun  阅读(123)  评论(0)    收藏  举报