2021 Nowcoder PJ #5 solve
T1:
分析题目数据可以发现,当前数的编号=这个数头上的数量+左边的数量。换句话说,若P(x,y),头上x−1行数量一共为s,那么它的编号应当为y+s−1。同时我们还能发现一个规律:第i行有n−i+1个数字,那么当前数头上的数字总数应当是一个等差数列S={s1,s2,s3......sn−1,sn}的和,那么这部分的数量应为(s1+sn)×n2,那么总体应为y+n∗(2×n−x+2)2。
同时注意到取值范围,可以发现1≤n≤1018,如果直接乘上去一定会爆掉。所以首先要用10取模才能乘。
#include <iostream>
#include <string.h>
#include <cstring>
using namespace std;
typedef long long LL;
LL n,x,y,sum,t1,t2;
int main()
{
//freopen("tri.in","r",stdin);
//freopen("tri.out","w",stdout);
scanf("%lld%lld%lld",&n,&x,&y);
t1 = (n << 1) - x + 2;
t2 = x - 1;if(t1 & 1) t2 >>= 1;
else t1 >>= 1;
sum = ((t1 % 10) * (t2 % 10)) % 10;
sum = (((sum + y - 1) % 10) + 10) % 10;
printf("%lld\n",sum);
//fclose(stdin);fclose(stdout);
return 0;
}
T2:
一道模拟题,难度不高。
先跑一遍整个循环得到有多少个乘除运算符,使用cnt记录下来。再跑第二遍的时候,如果遇到了第i个加减运算符,那么时间应为cnt+i。如果遇到了乘除运算符,那么其时间应为这个乘除运算符在所有乘除运算符中的位置。
#include <iostream>
#include <string.h>
#include <cstring>
#define sp1 cin.tie(0),cout.tie(0)
#define sp2 ios::sync_with_stdio(0)
using namespace std;
const int N = 1e6 + 10;
int n,t,len,cnt;
string s;
int main()
{
//freopen("cal.in","r",stdin);
//freopen("cal.out","w",stdout);
cin >> n >> s;
for(int i = 0;i < n;i++)
if(s[i] == '*' || s[i] == '/') t++;
for(int i = 0;i < n;i++)
if(s[i] == '+' || s[i] == '-')
cout << s[i] << "[" << ++t << "]";
else if(s[i] == '*' || s[i] == '/')
cout << s[i] << "[" << ++cnt << "]";
else if(s[i] <= 57 && s[i] >= 48)
cout << s[i];
//fclose(stdin);fclose(stdout);
return 0;
}