20234.8.21csp-j第三场模拟赛赛后总结

由于比赛题目未找到原题,所以就没有链接了 。直接放题目

T1:

题目分析:       

 根据样例可以知道,当n个元素都相等时,K=1,且当只一个元素时, K也=1。除了这两种情况,就从一到n模拟K值,再按照题意,模拟,直到全部满足条件就可以输出当前K值。 

代码:

#include<bits/stdc++.h>
//万能头文件
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma Gcc optinize("o1")
#pragma Gcc optinize("o2")
#pragma Gcc optinize("o3")
#pragma GCC optimize("Ofast")
//日常优化
#define int long long//方便一下
using namespace std;
const int N=2e5+1;
int t,n,a[N],x[N];

inline int read(){//运用快读节省时间
	int ans=0,j=1;char c=getchar();
	while(c>'9' or c<'0'){
        if(c=='-')j=-1;
        c=getchar();
	}
	while(c>='0' and c<='9'){
		ans=ans*10+c-'0';
		c=getchar();
	}
	return ans*j;
}

inline int bj(){
	for(int i=1;i<n;i++){
		memset(x,0,sizeof x);//每次清零一下
		bool flag=0;//用一个变量标记
		for(int j=1;j<=n-i+1;j++){
			for(int k=1;k<=i;k++){
                 x[j]|=a[j+k-1];
            {
			if(x[j]!=x[j-1] && j!=1){//如果当前的|得出的值不等于其他的,说明不和要求,且保证不是第一个元素与第零个元素
				flag=1;
				break;
			}
		}
		if(flag==0) return i;//如果变量始终未被标记,就返回当前的“K”值;
	}
	return n;//如果一直没有被标记就只能全部选择,只有一种| 的值就是符合要求的
}

int main(){
	freopen("lonely.in","r",stdin);
	freopen("lonely.out","w",stdout);
//按照考试要求使用freopen
	t=read();
	for(int i=1;i<=t;i++){
		n=read();
		memset(a,0,sizeof a);
		for(int j=1;j<=n;j++) a[j]=read();//从1到n输入序列元素
		cout<<bj()<<endl;//直接输出模拟得出的值
	}
	return 0;
}

错因:

模拟循环的时候边界条件有误,逻辑不清楚

T2:

题目分析:

因为题目要求是受距离不超过2的节点影响可以使用的元素,所以模拟出每个节点可能的颜色种数,根据乘积的原理,将每个点的可能的种数相乘就可以得到总数

图中的K就是可以染的颜色的数目,经过相减得到每个点的种数。 

#include<bits/stdc++.h> 
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3) 
#pragma Gcc optinize("o1")
#pragma Gcc optinize("o2")
#pragma Gcc optinize("o3")
#pragma GCC optimize("Ofast")
#define int long long


using namespace std;
int n,k,ans=1,dis[N];
const int N=5e5+5,INF=1e9+7; 
vector<int>v[N],w[N]; 
inline long long read() { 
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
inline void dfs(int x,int fa){
	dis[x]=k;
	for(int i=0;i<w[x].size();i++){
		if(dis[w[x][i]])	dis[x]--;
	}	
	for(int i=0;i<v[x].size();i++){
		if(v[x][i]==fa)	continue;
		dfs(v[x][i],x); 
	}
}                                            
signed main(){
	freopen("color.in","r",stdin);
	freopen("color.out","w",stdout);
	n=read();
	k=read();
	for(int i=1;i<n;i++){
		int x,y;
		x=read();
		y=read();
		v[x].push_back(y);
		v[y].push_back(x);  
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<v[i].size();j++){
			w[i].push_back(v[i][j]);
			for(int l=0;l<v[v[i][j]].size();l++){
				int z=v[v[i][j]][l];
				if(i==z) {
					continue;
				}
				w[i].push_back(z);
			}
		}
	}
	dfs(1,0);
	for(int i=1;i<=n;i++){
			ans=ans*dis[i]%INF;
	}
	printf("%d",ans);
	return 0;
}

错因:

没有思路

T3:

题目分析:

根据题目要求可以得到这两种操作::

        删除 s 中的任意一个字符。

        将 s 中任意一个区间的字符排序

第二种操作可以看作是如果左边的字符大于等于当前字符,就可以将当前字符左移一位。

从左到右遍历 t,在 s 中寻找当前 t 中对应的字符的第一个,然后将 s 还未匹配完的部分的前面比当前字符小的字符删去,将这个字符挪到前面,于是这一位匹配成功了。

如果中途找不到对应字符,即匹配失败。输出“NO;

代码

#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma Gcc optinize("o1")
#pragma Gcc optinize("o2")
#pragma Gcc optinize("o3")
#pragma GCC optimize("Ofast")

using namespace std;
const int MaxN=220000;

void Solve(){
	string s,t;
	int n,m;
	set<int>st[29];
	cin>>n>>m>>s>>t;
	for(int i=0;i<n;i++)st[s[i]-'a'].insert(i);
	for(int i=0;i<m;i++){
		if(st[t[i]-'a'].empty()){
			cout<<"NO\n";
			return;
		}
		int pos=*st[t[i]-'a'].begin();
		for(char c='a';c<t[i];c++){
			while(st[c-'a'].size()&&*st[c-'a'].begin()<pos)
				st[c-'a'].erase(st[c-'a'].begin());
		}
		st[t[i]-'a'].erase(st[t[i]-'a'].begin());
	}
	cout<<"YES\n";
}

int main(){
	freopen("obtain.in","r",stdin);
	freopen("obtain.out","w",stdout);
	int T;
	cin>>T;
	while(T--)
		Solve();
	return 0;
}

错因:

未充分理解题意

T4

根据输入创建图表,使用dij方法进行遍历 

【因为太难了还没做出来】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值