A
签到水体
By wdjuruo, contest: Codeforces Round #629 (Div. 3), problem: (A) Divisibility Problem, Accepted, #, Copy, hack it!
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
int t;
scanf("%d",&t);
while(t--)
{
ll a,b;
scanf("%lld%lld",&a,&b);
if(a%b==0&&a>=b){
cout<<0<<endl;
continue;
}
printf("%lld\n",b-a%b);
}
return 0;
}
B
模拟题 可以看出代码中的规律
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
scanf("%d",&t);
while (t--)
{
int n,k;
//可以发现这个规律
//第一个b 第二个移动个数
/**0 - > 1
* 1 - > 2
* 2 - > 3
* 3 - > 4
*/
scanf("%d%d",&n,&k);
int s=1;
int mv=0;
while (k>=s){
k-=s;
mv++;
s+=1;
}
if(k==0){
mv--;
// cout<<"mv="<<mv<<endl;
for(int i=1;i<=n-2-mv;i++){
cout<<'a';
}
cout<<'b';
for(int i=n-2-mv+2;i<n-(mv+1);i++){
cout<<'a';
}
cout<<'b';
for(int i=n-mv+1;i<=n;i++){
cout<<'a';
}
cout<<endl;
continue;
}
//cout<<"mv="<<mv<<endl;
for(int i=1;i<=n-2-mv;i++){
cout<<'a';
}
cout<<'b';
for(int i=n-2-mv+2;i<n-(k-1);i++){
cout<<'a';
}
cout<<'b';
for(int i=n-k+2;i<=n;i++){
cout<<'a';
}
cout<<endl;
}
return 0;
}
C
水题
感觉比B简单
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
scanf("%d",&t);
while (t--)
{
int n;
scanf("%d",&n);
string s;
cin>>s;
string res1="1";
string res2="1";
int flag=0;
for(int i=1;i<s.length();i++){
if(s[i]=='0'){
res1+="0";
res2+="0";
}
else{
if(s[i]=='1'&&flag==0){
res1+="1";
res2+="0";
flag=1;
}
else if(s[i]=='1'&&flag==1){
res1+="0";
res2+="1";
}
else if(s[i]=='2'&&flag==0){
res1+="1";
res2+="1";
}
else if(s[i]=='2'&&flag==1){
res1+="0";
res2+="2";
}
}
}
cout<<res1<<endl<<res2<<endl;
}
return 0;
}
D
也是一个贪心模拟题
主要思路是 如果有相邻的2个值是相等的 那么这个数列就会有一个容错的东西,
也就是说开始我贪心的让每两个相邻的染色都不一样,不是1就是2
然后关键就是第n-1个,第n个和第1个 他们之间有关系需要处理
当他们3个不足以实现染色不同时,我们就可以从刚刚记录的容错位置开始
让他们2变1 然后1变2;
谨记不要忘了 每一种情况的处理
还是有点麻烦的
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int a[maxn];
int flag[maxn];
int main() {
int t;
scanf("%d",&t);
while (t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
}
memset(flag,0,sizeof flag);
int ans=1;
flag[1]=ans;
int fx=0;
for(int i=2;i<=n;i++){
if(a[i]!=a[1]){
fx=1;
}
}
if(!fx){
cout<<1<<endl;
for(int i=1;i<=n;i++){
cout<<1<<" ";
}
cout<<endl;
continue;
}
int rat=0;//rat容错位置
for(int i=2;i<=n;i++){
if(a[i]==a[i-1]){
rat=i;
}
if(flag[i-1]>1){
flag[i]=flag[i-1]-1;
ans=max(ans,flag[i]);
}
else{
flag[i]=flag[i-1]+1;
ans=max(ans,flag[i]);
}
}
if(a[n]!=a[n-1]&&a[n]!=a[1]&&a[1]!=a[n-1]){
if(rat==0){
if(flag[n-1]!=flag[1]){
ans=3;
flag[n]=3;
cout<<ans<<endl;
for(int i=1;i<=n;i++){
cout<<flag[i]<<" ";
}
cout<<endl;
}
else{
ans=2;
cout<<ans<<endl;
flag[n]=3-flag[1];
for(int i=1;i<=n;i++){
cout<<flag[i]<<" ";
}
cout<<endl;
}
}
else{
cout<<2<<endl;
if(flag[n-1]!=flag[1]){
for(int i=1;i<rat;i++){
cout<<flag[i]<<" ";
}
for(int i=rat;i<=n;i++){
cout<<3-flag[i]<<" ";
}
cout<<endl;
}
else{
flag[n]=3-flag[1];
for(int i=1;i<=n;i++){
cout<<flag[i]<<" ";
}
cout<<endl;
}
}
}
else{
if(a[n-1]==a[1]){
if(rat==0&&flag[n-1]!=flag[1]){
ans=3;
cout<<ans<<endl;
flag[n]=ans;
for(int i=1;i<=n;i++){
cout<<flag[i]<<" ";
}
cout<<endl;
}
else if(rat!=0&&flag[n-1]!=flag[1]){
cout<<2<<endl;
for(int i=1;i<rat;i++){
cout<<flag[i]<<" ";
}
for(int i=rat;i<=n;i++){
cout<<3-flag[i]<<" ";
}
cout<<endl;
}
else if(flag[n-1]==flag[1]){
flag[n]=3-flag[1];
cout<<2<<endl;
for(int i=1;i<=n;i++){
cout<<flag[i]<<" ";
}
cout<<endl;
}
}
else{
if(a[n]==a[n-1]){
flag[n]=3-flag[1];
}
else{
flag[n]=3-flag[n-1];
}
cout<<2<<endl;
for(int i=1;i<=n;i++){
cout<<flag[i]<<" ";
}
cout<<endl;
}
}
}
return 0;
}