4.82022河南ccpc省赛

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;
}

posted @ 2024-04-09 14:31  涤生yang  阅读(23)  评论(0)    收藏  举报