由于比赛题目未找到原题,所以就没有链接了 。直接放题目
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方法进行遍历
【因为太难了还没做出来】