牛客模拟练习

题目地址


注:有的题(第三个)并没有ac,先放个错误答案。以及好多细节处理的并不好

  1. F
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>

using namespace std;

typedef pair<int,int> PII;
int row1[6],col1[6],a1,b1; //行、列、主对角线、次对角线.
int row2[6],col2[6],a2,b2; //行、列、主对角线、次对角线.
map<int,PII> mp1,mp2;
string s[27];

void solve(){
    
    
    memset(row1,0,sizeof row1);
    memset(row2,0,sizeof row2);
    memset(col1,0,sizeof col1);
    memset(col2,0,sizeof col2);
    a1 = 0,b1 = 0,a2 = 0,b2 = 0;
    string ss;
    for(int i=1;i<=5;i++){
    
    
        for(int j=1;j<=5;j++){
    
    
            cin >> ss;
            int x = (ss[0]-'0')*10+(ss[1]-'0');
            mp1[x] = make_pair(i,j);
//             cout << x << " ";
        }
//         cout << endl;
    }
    for(int i=1;i<=5;i++){
    
    
        for(int j=1;j<=5;j++){
    
    
            cin >> ss;
            int x = (ss[0]-'0')*10+(ss[1]-'0');
            mp2[x] = make_pair(i,j);
//             cout << x << " ";
        }
//         cout << endl;
    }
    
    for(int i=0;i<25;i++)    cin >> s[i];
//     for(int i=0;i<25;i++){
    
    
//         ss = s[i];
//         int x = (ss[0]-'0')*10+(ss[1]-'0');
//         cout << x << " ";
//     }
    
    bool f1 = 0,f2 = 0;
    for(int i=0;i<25;i++){
    
    
        ss = s[i];
        int x = (ss[0]-'0')*10+(ss[1]-'0');
        
        if(++row1[mp1[x].first]==5){
    
    
            f1 = 1;
        }
        if(++col1[mp1[x].second]==5){
    
    
            f1 = 1;
        }
        
        if(mp1[x].first==mp1[x].second){
    
    
            a1++;
            if(a1==5)    f1 = 1;
        }
        
        if(mp1[x].first+mp1[x].second==5){
    
    
            b1++;
            if(b1==5)    f1 = 1;
        }
        if(++row2[mp2[x].first]==5){
    
    
            f2 = 1;
        }
        if(++col2[mp2[x].second]==5){
    
    
            f2 = 1;
        }
        
        if(mp2[x].first==mp2[x].second){
    
    
            a2++;
            if(a2==5)    f2 = 1;
        }
        
        if(mp2[x].first+mp2[x].second==5){
    
    
            b2++;
            if(b2==5)    f2 = 1;
        }
        
        if(f1 || f2)    break;
    }
    
    if(f1==1&&f2==1)    puts("0");
    else if(f1==1)    puts("1");
    else if(f2==1)    puts("2");
}

int main()
{
    
    
    int t;
    scanf("%d",&t);
    while(t--){
    
    
        solve();
    }
    
    return 0;
}
  1. 螺旋矩阵
// 71*71

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

char s[80][80];

void solve(){
    
    
    for(int i=0;i<=80;i++)
        for(int j=0;j<=80;j++)
            s[i][j] = '.';
            
    string ss;
    cin >> ss;
     int len = ss.size();
     s[36][36] = ss[0];
    
//     // 按照右上左下的顺序
     int i = 36,j = 36;
     int d = 4; // 1,2,3,4分别代表右上左下
     for(int k=1;k<len;k++){
    
    
         if(d==4){
    
    
             if(s[i][j+1]!='.'){
    
     //向下走.
                 s[++i][j] = ss[k];
             }else{
    
              //向右走.
                 d = 1;
                 s[i][++j] = ss[k];
             }
         }else if(d==1){
    
    
             if(s[i-1][j]!='.'){
    
     //向右走.
                 s[i][++j] = ss[k];
             }else{
    
              //向上走.
                 d = 2;
                 s[--i][j] = ss[k];
             }            
         }else if(d==2){
    
    
             if(s[i][j-1]!='.'){
    
     //向上走.
                 s[--i][j] = ss[k];
             }else{
    
              //向左走.
                 d = 3;
                 s[i][--j] = ss[k];
             }            
         }else if(d==3){
    
    
             if(s[i+1][j]!='.'){
    
     //向左走.
                 s[i][--j] = ss[k];
             }else{
    
              //向下走.
                 d = 4;
                 s[++i][j] = ss[k];
             }            
         }          
    }
     
//    for(int i=30;i<=40;i++){
    
    
//        for(int j=30;j<=40;j++)
//            printf("%c",s[i][j]);
//        printf("\n");
//	}
//	cout << "d=" << d << endl;
     // 右上左下.
//  
	if((s[i-1][j-1]!='.'&&s[i+1][j-1]!='.') || (s[i-1][j+1]!='.'&&s[i+1][j+1]!='.')
	   || (s[i-1][j-1]!='.'&&s[i-1][j+1]!='.') || (s[i+1][j-1]!='.'&&s[i+1][j+1]!='.')){
    
    
		
	}else if((s[i-1][j]!='.'&&s[i-1][j+1]!='.'&&s[i][j+1]=='.')||(s[i+1][j]!='.'&&s[i+1][j+1]!='.'&&s[i][j+1]=='.')){
    
    
		d = 1;
	}else if((s[i][j-1]!='.'&&s[i-1][j-1]!='.'&&s[i-1][j]=='.')||(s[i][j+1]!='.'&&s[i-1][j+1]!='.'&&s[i-1][j]=='.')){
    
    
		d = 2;
	}else if((s[i+1][j-1]!='.'&&s[i+1][j]!='.'&&s[i][j-1]=='.')||(s[i-1][j-1]!='.'&&s[i-1][j]!='.'&&s[i][j-1]=='.')){
    
    
		d = 3;
	}else if((s[i+1][j+1]!='.'&&s[i][j+1]!='.'&&s[i+1][j]=='.')||(s[i][j-1]!='.'&&s[i+1][j-1]!='.'&&s[i+1][j]=='.')){
    
    
		d = 4;
	}
    
	if(d==1){
    
    
         if(s[i-1][j+1]!='.'){
    
    
             while(s[i-1][j+1]!='.'){
    
    
                 s[i][++j] = ' ';
             }
         }
     }else if(d==2){
    
    
         if(s[i-1][j-1]!='.'){
    
    
             while(s[i-1][j-1]!='.'){
    
    
                 s[--i][j] = ' ';
             }
         }        
     }else if(d==3){
    
    
         if(s[i+1][j-1]!='.'){
    
    
             while(s[i+1][j-1]!='.'){
    
    
                 s[i][--j] = ' ';
             }
         }        
     }else if(d==4){
    
    
         if(s[i+1][j+1]!='.'){
    
    
             while(s[i+1][j+1]!='.'){
    
    
                 s[++i][j] = ' ';
             }
         }   
     } 

//    for(int i=30;i<=40;i++){
    
    
//        for(int j=30;j<=40;j++)
//            printf("%c",s[i][j]);
//        printf("\n");
//	}

//    for(int i=31;i<=40;i++){
    
    
//    	for(int j=32;j<=40;j++)
//            printf("%c",s[i][j]);
//    printf("\n");
//	}
    
    for(int i=1;i<=80;i++){
    
    
    	bool f = 0;
        for(int j=1;j<=80;j++){
    
    
            if(s[i][j]!='.'){
    
    
                printf("%c",s[i][j]);
                f = 1;
            }
        }
        if(f)	printf("\n");
    }
     printf("\n");
}

int main()
{
    
    
    int t;
    scanf("%d",&t);
    while(t--){
    
    
        solve();
    }
    
    return 0;
}

// fjksdklsfasnkfsbfjdifsknsdfsdlg
  1. 相对分子质量
    这道不知道哪里出问题了.感觉思路很清晰,写的很简洁了.
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <cstring>
#include <cmath>
#include <stack>

using namespace std;

typedef long long ll;
map<string,ll> mp;
stack<ll> st;

int main()
{
    
    
    ll n,m;
    scanf("%lld%lld",&n,&m);
    string s;
    for(ll i=1;i<=n;i++){
    
    
        cin >> s;
        ll x;
        scanf("%lld",&x);
        mp[s] = x;
//         cout << s << " " << mp[s] << endl;
    }
    
    for(ll j=1;j<=m;j++){
    
    
        
        string ss;
        cin >> ss;
        ll len = ss.size();
    
        s = "";
        for(ll i=0;i<len;i++){
    
    
        
            if(ss[i]=='('){
    
    
                st.push(-1);
            }else if(ss[i]==')'){
    
    
                ll sum = 0;
                while(st.top()!=-1){
    
    
                    sum += st.top();
                    st.pop();
                }
                st.pop();
                st.push(sum);
            }else if((ss[i]>='a'&&ss[i]<='z') || (ss[i]>='A'&&ss[i]<='Z')){
    
    
                s = s+ss[i];
//                 cout << "s=" << s << endl;
                if(mp[s]){
    
    
//                     cout << "mp[s]=" << mp[s] << endl;
                    st.push(mp[s]);
                    s = "";
                }
            }else if(ss[i]>='0'&&ss[i]<='9'){
    
    
                string sss = "";
                while(ss[i]>='0'&&ss[i]<='9'){
    
    
                    sss += ss[i];
                    i++;
                }
//                 cout << "sss=" << sss << endl;
                ll cnt = 0;
                ll mid = 1;
                for(ll k=sss.size()-1;k>=0;k--){
    
    
                    cnt += mid*(sss[k]-'0');
                    mid *= 10;
                }
//                 cout << "cnt=" << cnt << endl;
                ll sum = st.top();
                st.pop();
                sum *= (cnt);
//                 cout << "sum=" << sum << endl;
                st.push(sum);
                
                i--;
            }
        }
        
        ll ans = 0;
        while(!st.empty()){
    
    
            if(st.top()==-1){
    
    
                st.pop();
                continue;
            }
            ans += st.top();
            st.pop();
        }
        
        printf("%lld\n",ans);
    }
    
    
    return 0;
}

/*
4 1
Ba 66
O 16
H 1
C 12
Ba((OH)2(CO3)2)3

debug:(OH)10
*/
  1. 统计个数
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 210;

int t, n, m;
bool g[N][N];

int gcd(int a, int b){
    
    
	return b ? gcd(b, a % b) : a;
}

int in[N];
int a[N];
int main()
{
    
    
	cin >> t;
	a[1] = 1; a[0] = 1;
	for (int i = 2; i <= 200; i++){
    
    
		a[i] = a[i - 1] * i;
	}
	while (t--)
	{
    
    
		memset(g, false, sizeof g);
		memset(in, 0, sizeof in);
		scanf("%d%d", &n, &m);
		for (int i = 0; i < m; i++)
		{
    
    
			int x, y;
			scanf("%d%d", &x, &y);
			g[x][y] = true;
			g[y][x] = true;
			in[x]++;
			in[y]++;
		}

		int p = 0, q = 0;
		for (int i = 1; i <= n; i++)
			for (int j = i+1; j <= n; j++){
    
    
				for (int k = j+1; k <= n; k++){
    
    
					if (g[j][i] && g[i][k]){
    
    
						q++;
						if (g[j][k]) p++;
					}
				}
			}

		int ans = 0;
// 		cout << p*3 << ' ' << q << endl;
        // 统计入度数.
		for (int i = 1; i <= n; i++){
    
    
			ans += (in[i] * (in[i] - 1)) / 2;
		}
		if (!p) puts("0/1");
		else
		{
    
    
			p = p*3, q;
			int q = gcd(p, ans);
			printf("%d/%d\n", p/q , ans/q);
		}
	}

	return 0;
}


PS:模拟能力有待提升.要注重细节处理,全盘考虑想清楚.

猜你喜欢

转载自blog.csdn.net/m0_50435987/article/details/121078503