A题
签到题
找到102345 这个规律,即可,大于10就直接是-1了
先打个1.然后从2开始,有2打0,有3打3-1,有4打4-1
直接打印数字就好了,一共就最多10个,不用转接to_string
#include<bits/stdc++.h>
using namespace std;
#define int long long
const char nl = '\n';
void test(){
int n;
cin>>n;
if(n>10){
cout<<-1<<endl;
}else{
cout<<1;
for(int i=2;i<=n;i++){
if(i==2){
cout<<0;
}
else
{
cout<<i-1;
}
}
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t;
t=1;
while(t--)
test();
return 0;
}
E题
//存不存在(YES/NO)问题,都要看边界,看如果存在则最边的一定存在
//这道题,我想的是怎么解决交叉问题
//其实根本不用想那么多,你先给我找到5个再说(找到最前面的5个再说,这是最基本条件吧)
//然后你把那5个都截了,再给我找7个。
//所以只要观察最边界,最基本的东西就行了,你先别管交叉,前面有5个再说吧
//cui想的确实很快,这个底线思维很好,我在那纠结怎么交叉这种高级问题,实际上你先把最基本的做了再说
#include<bits/stdc++.h>
using namespace std;
#define int long long
const char nl = '\n';
void test(){
int n;
char mp[4];//记录这个字符
bool t1=false,t2=false;
map<char,int>m;
int cnt=0;
cin>>n;
string s;
cin>>s;
if(n<17){//如果整个串小于17,直接输出无
cout<<"none"<<endl;
}else{
for(int i=0;i<s.size();i++){
m[s[i]]++;//m对字符计数
if(m[s[i]]==5&&!t1){//达到5个了
mp[++cnt]=s[i];//记录这个字符
t1=true;//只要第一个5个字符的
m.clear();//清空,重新计数了
continue;
}
if(m[s[i]]==7&&t1){//第一个有7个的字符 (而且还是先有了5个之后的,t1的作用)
mp[++cnt]=s[i];//记录
t2=true;
m.clear();//再清空
continue;
}
if(m[s[i]]==5&&t2){//如果连着的7个找到了
mp[++cnt]=s[i];
break;
}
}
if(cnt<3){//如果你只记录了两个字符,那么肯定是...只有5 7 没有最后一个5
cout<<"none"<<endl;
}else{//如果是3个,那就是成功了,下面只是打印,不需要再验证了
for(int i=1;i<=cnt;i++){
if(i==1){
for(int j=0;j<5;j++){
cout<<mp[i];
}
continue;
}
if(i==2){
for(int j=0;j<7;j++){
cout<<mp[i];
}
continue;
}
if(i==3){
for(int j=0;j<5;j++){
cout<<mp[i];
}
continue;
}
}
}
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t;
t=1;
while(t--)
test();
return 0;
}
F题
没啥可解释的,先找奇数的规律,再找奇数通过什么样一种变换,让其个数+1吧
1、先猜到0这个特殊值
2、猜到奇数规律 0123
3、偶数就是把3加1 0124
#include<bits/stdc++.h>
using namespace std;
#define int long long
const char nl = '\n';
void test(){
int n;
cin>>n;
if(n==1){//如果是1,
cout<<1<<nl;
cout<<1<<endl;
return ;
}
if(n%2==0){
if(n==2){
cout<<-1<<endl;
return ;
}
if(n==4){
cout<<-1<<endl;
return ;
}
n++;
n/=2;
cout<<n<<endl;
for(int i=0;i<n-1;i++){
cout<<i<<" ";
}
cout<<n<<" ";
cout<<endl;
}else{
n++;
n/=2;
cout<<n<<endl;
for(int i=0;i<n;i++)
cout<<i<<" ";
}
}
signed main() {
int t;
t=1;
while(t--)
test();
return 0;
}
G题
规律1:如果某一列但凡有一个0的话,那相与的最后结果就是0
规律2:两个字符子串进行相与,但凡有一个0,你再怎么替换也去除不了这个0,一直都是0.
规律3:两个字符子串进行相与,如果这一列都是1,你再怎么相与,替换,结果还是1
结论:相与或者补相与根本没啥影响,因为一开始是啥,结果就是啥————所以结果一直都只有一个,而且其可能性是100%,所以期望,就是这个结果(根本没用着期望的计算)
实现思路:看哪一行是一开始就没有0,全是1的。去寻找0的个数,有0就标记本列,最后找出全1列的个数,就是最终答案
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m;cin>>n>>m;
int f[4000]={0};
string s;
while(n--)
{
cin>>s;
for(int i=0;i<m;i++)
{
if(s[i]=='0')
{
f[i]=1;//标记本列
}
}
}
int t;cin>>t;//只是给个位置让你输入而已,没啥用处
while(t--)
{
int a,b,c,d,e;
cin>>a>>b>>c>>d>>e;//只是给个位置让你输入而已,没啥用处
}
cout<<count(f,f+m,0);//永远都是这个数
return 0;
}
标签:include,相与,int,ccpc,long,cin,using,省赛,4.82022
From: https://www.cnblogs.com/yzzyang/p/18123918