欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

3月24日 模拟赛题解

程序员文章站 2024-03-17 20:00:28
...

3月24日 模拟赛题解

此题我用stack做出了负数,至今不知道为什么,代码如下,麻烦知道的各位大神能告知小的一声:

//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<string>
#include<queue>
#include<cstdlib>
#include<stack>
#include<cmath>
#include<cctype>
using namespace std;
int temp = 0,t1,t2;
int k = 0;
bool flag = 0;

char c;
long long p;
stack<long> num;
stack<char> s;

int main()
{
//	freopen("expr.in","r",stdin);
//	freopen("expr.out","w",stdout);
	while(1)
	{
		if(flag == 0)
		{
			scanf("%lld",&p);
			num.push(p);
			flag = 1;
			k++;
		}
		else{
			if(k >= 2)
			{
				if(s.top() == '*')
				{
					t1 = num.top();
					num.pop();
					t2 = num.top();
					num.pop();
					num.push(t1 * t2);
					s.pop();
				}
			}					
			c = getchar();
			if(c == '\n') break;
			s.push(c);
			flag = 0;			
		}	
	}
	while(!s.empty())
	{
		t1 = num.top();
		num.pop();
		t2 = num.top();
		num.pop();
		s.pop();
		num.push(t1 + t2);
	}
	printf("%d",num.top()%10000);
	return 0;
}

看到网上大佬的做法,瞬间觉得被碾压。

做法其实就是乘积成块,块区相加。

理解了原理后就好写了:

#include<bits/stdc++.h>
using namespace std;
long long num,sum = 0;
long long cj;
char ch = 0,c;
bool over = 0;
int main()
{
	while(!over)
	{
		scanf("%lld",&num);
		over = scanf("%c",&c) == 1 ? 0 : 1;
		if(ch == 0) cj = num;//一开始单独成块
		if(ch == '+') sum = (sum + cj) % 10000,cj = num;//加上块
		if(ch == '*') cj = (cj * num) % 10000;//成块
		if(over) sum = (sum + cj)%10000;
		ch = c;//保存上一字符
	}
	printf("%lld",sum);
	return 0;
}

3月24日 模拟赛题解

#include<bits/stdc++.h>
#define MAXA 1000005
using namespace std;
bool isFirst;
long long n,MOD;
long long temp[MAXA],T[MAXA],Fenshu[MAXA],ff[MAXA],MAXN;
int main() {
scanf("%lld %lld",&n,&MOD);
for(int i = 1;i <= n;i++)
    scanf("%lld",&ff[i]);
temp[1] = T[1] = MAXN = ff[1];
for(int i=2;i<=n;i++) {
temp[i] = max(temp[i - 1] + ff[i],ff[i]);
T[i] = max(MAXN,temp[i]);
MAXN = T[i];
}
Fenshu[1] = T[1];
Fenshu[2] = T[1] + Fenshu[1];
MAXN = Fenshu[2];
isFirst = Fenshu[1] <= Fenshu[2] ? false : true;
for(int i=3;i<=n;i++) {
if(T[i-1] > 0) {
Fenshu[i] = Fenshu[i-1] + T[i-1];
isFirst = Fenshu[i] > Fenshu[1] ? false : true;
if(Fenshu[i] > 10000000000)
   Fenshu[i] %= MOD;
}
else
  Fenshu[i] = Fenshu[2];
}
if(isFirst)
printf("%lld",Fenshu[1] % MOD);
else
    printf("%lld",Fenshu[n] % MOD);

}3月24日 模拟赛题解

#include<bits/stdc++.h>   
using namespace std;
bool dis[1001][1001],els[1001];  
int to[1001],p,f[1001],b,i[1001],j[1001];
int n,m,a,ans=0;
int main(){
    
    scanf("%d %d",&n,&m);
    int tot = n;   
    for(int y = 0;y < m;y++){
        cin >> a;
int o,k,n1 = 0,n2 = 0;
        for(int x = 1;x <= a;x++){
            cin >> b;
            if(x == 1) o = b;
            if(x == a) k = b;
            f[b] = 1;
        }
        for(int x = o;x <= k;x++){
            if(f[x])i[++n1] = x;
            else j[++n2] = x;
        }
        for(int x = 1;x <= n1;x++){
            for(int z = 1;z <= n2;z++){
                if(!dis[i[x]][j[z]])to[i[x]]++;
                dis[i[x]][j[z]] = 1;
            }
        }
        memset(f,0,sizeof f);
    }
    while(tot){  
        ans++;
        int w[n],nu = 0;
        for(int x = 1;x <= n;x++){
            if(!to[x]&&!els[x]){
                tot--;  
                els[x] = 1;
                w[++nu] = x; 
            }
        }
        for(int x = 1;x <= nu;x++){
            for(int y = 1;y <= n;y++){
                    if(dis[y][w[x]])to[y]--;
            }
        }
    }
printf("%d",ans); 
    return 0;

}

n支队伍打比赛,每两支队伍恰好比赛一场。平局时各得1分,而有胜负时胜者3分,负者0分。

假设三支队伍得分分别为3, 3, 3,则可能有两种情况:

队伍 A B C 得分

A - 3 0 3

B 0 - 3 3

C 3 0 - 3

队伍 A B C 得分

A - 0 3 3

B 3 - 0 3

C 0 3 - 3

给出n支队伍的最终得分(即所有比赛均已结束),统计有多少种可能的分数表。

Input

第一行包含一个正整数n,队伍的个数。第二行包含n个非负整数,即每支队伍的得分。

Output

输出仅一行,即可能的分数表数目。保证至少存在一个可能的分数表。

Sample Input

样例输入1:

3

3 3 3

样例输入2:

2

0 3

样例输入3:

3

4 1 2

样例输入4:

6

5 6 7 7 8 8

Sample Output

样例输出1:

2

样例输出2:

1 样例输出3:

1

样例输出4:

121

Data Constraint

Hint

【数据规模】

数据 1 2~3 4~6 7~12 13~19 20~25

n 3 4 5 6 7 8

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
#define ll long long


int n,a[10],b[10];
int ans = 0;
int score[5] = {3,1,0,0};


void dfs(int x,int y)
{
if(b[x] > a[x]) return;
if(x == n && b[x] == a[x])
{
ans++;
return; 
}
if(y == n)
{
int t = a[x] - b[x];
if(t == 2) return;
b[y] += score[t];

dfs(x+1,x+2);

b[y] -= score[t];
}
else{
b[x] += 3;
dfs(x,y+1);
b[x] -= 3;
b[y] += 3;
dfs(x,y+1);
b[y] -= 3;
b[x] += 1;
b[y] += 1;
dfs(x,y+1);
b[x] -= 1;
b[y] -= 1;
}
}
int main()
{
scanf("%d",&n);
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
}
dfs(1,2);
printf("%d",ans);
return 0;
}