题目传送门

A 减法和求余

B 回文串

C 涂色仪式

D 除法来咯

T1减法和求余

思路

首先取模很简单,因为取模完后越变越小,输出最小的,减法的话则是所有数字的和减去最小的数字2*2,因为我们开始是把最小的数作为被减数,注意n=1,k=1n=1,k=1的特判

代码

#include<bits/stdc++.h>
using namespace std;
long long a[100010];
int main(){
	freopen("divmod.in","r",stdin);
	freopen("divmod.out","w",stdout);
	long long n,k;
	cin>>n>>k;
	if((k==1&&n==1)){
		int x;
		cin>>x;
		cout<<x;
	}
	else if(k==1){
		long long s=0;
		for(long long i=1;i<=n;i++){
			cin>>a[i];
			s+=a[i];
		}
		sort(a+1,a+1+n);
		cout<<s-a[1]*2;
	}
	else{
		for(long long i=1;i<=n;i++)cin>>a[i];
		sort(a+1,a+1+n);
		cout<<a[1];
	}
	return 0;	
}

错的点

考试时没有特判,以后要注意一下数据范围,不能出现这些小错误

T2回文串

思路

其实就是一道大模拟,但是要注意很多细节,测很多样例,所以请细心的按题目要求写

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
	freopen("hw.in","r",stdin);
	freopen("hw.out","w",stdout);
	string s;
	cin>>s;
	string p=s;
	reverse(s.begin(),s.end());
	if(p==s){	
		int n=s.size();
		int l=0;
		for(int i=0;i<(n/2);i++){
			int  d=n-i-1;
			if(s[d]!='a'){
				s[d]=s[i]='a';
				l=1;
				break;
			}
		}
		if(!l&&n%2==1){
			int f=n/2;
			f=n-f;
			f--;
			s[f]='a';
		}
		cout<<s;	
	}
	else{
		int n=s.size();
		int g=0;
		for(int i=0;i<(n/2);i++){
			int  d=n-i-1;
			if(s[d]!=s[i])g++;
		}
		if(g==1){
			int l=0;
			for(int i=0;i<(n/2);i++){
				int  d=n-i-1;
			
				if(s[d]!=s[i])
				{
					if(s[i]=='a')l++;
					if(s[d]=='a')l++;
					s[d]=s[i]='a';
				}
			}
			if(l&&n%2==1){
				int f=n/2;
				f=n-f;
				f--;
				s[f]='a';
			}
		}
		else{
			for(int i=0;i<(n/2);i++){
				int  d=n-i-1;
				if(s[d]!=s[i]){			
					if(s[d]<s[i])s[i]=s[d];
					else s[d]=s[i];
				}
			}
		}
		reverse(s.begin(),s.end());
		cout<<s;
	}
	return 0;	
}

T3涂色仪式

思路

这道题发现其实只要可以涂就可以涂,不用卡绿颜色冲突(不影响),所以有多少个和质数为就数出多少个

代码

#include<bits/stdc++.h>
using namespace std;
int st[2000010],a[300010],n;
void g(int n) {
	int c=0;
	st[0]=1;
	st[1]=1;
	for (int i=2;i<=n;i++) {
		if(!st[i]){
			for(int j=2;j*i<=n;j++)st[j*i]=1;
		}
	}
}
int main(){
	freopen("color.in","r",stdin);
	freopen("color.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	g(2000000);
	int c=0;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		if(!st[a[x]+a[y]])c++;
	}
	cout<<c;	
	return 0;	
}

错的点

考试时写搜索写错了,以后写这种题要多想想写更好的解法