A - Petya and Java
- 题意
一个数在byte,short,int,long,BigInter哪个数据类型对应的范围
- 思路
这题比赛坑了我,由于我不会java和python开大数所以这题就想老老实实开个vector输入字符串模拟下,代码写完200多行,调不出来心态爆炸,卒。后来看到strcmp我哭了,但自己的思路含着泪也要模拟完。比赛结束后撸了一会代码最终还是撸出来了。果然还是大整数神教好啊QAQ。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
int main() {
string a;
vector<int> A;
cin >> a;
if(a[0] == '-') {
for(int i = 1;i < a.size();i++) {
A.push_back(a[i] - '0');
}
if(A.size() <= 3) {
string s = "128";
if(A.size() < 3 || a == s) {
cout << "byte" << endl;
}
else {
for(int i = 0;i < A.size();i++) {
if(A[i] == (s[i] - '0')) {
continue;
}
else {
if(A[i] > (s[i] - '0')) {
cout << "short" << endl;
break;
}
else {
cout << "byte" << endl;
break;
}
}
}
}
}
else if(A.size() <= 5) {
string s = "32768";
if(A.size() < 5 || a == s) {
cout << "short" << endl;
}
else {
for(int i = 0;i < A.size();i++) {
if(A[i] == (s[i] - '0')) {
continue;
}
else {
if(A[i] > (s[i] - '0')) {
cout << "int" << endl;
break;
}
else {
cout << "short" << endl;
break;
}
}
}
}
}
else if(A.size() <= 10) {
string s = "2147483648";
if(A.size() < 10 || a == s) {
cout << "int" << endl;
}
else {
for(int i = 0;i < A.size();i++) {
if(A[i] == (s[i] - '0')) {
continue;
}
else {
if(A[i] > (s[i] - '0')) {
cout << "long" << endl;
break;
}
else {
cout << "int" << endl;
break;
}
}
}
}
}
else if(A.size() <= 19) {
string s = "9223372036854775808";
if(A.size() < 19 || a == s) {
cout << "long" << endl;
}
else {
for(int i = 0;i < A.size();i++) {
if(A[i] == (s[i] - '0')) {
continue;
}
else {
if(A[i] > (s[i] - '0')) {
cout << "BigInteger" << endl;
break;
}
else {
cout << "long" << endl;
break;
}
}
}
}
}
else {
cout << "BigInteger" << endl;
}
}
else {
for(int i = 0;i < a.size();i++) {
A.push_back(a[i] - '0');
}
if(A.size() <= 3) {
string s = "127";
if(A.size() < 3 || a == s) {
cout << "byte" << endl;
}
else {
for(int i = 0;i < A.size();i++) {
if(A[i] == (s[i] - '0')) {
continue;
}
else {
if(A[i] > (s[i] - '0')) {
cout << "short" << endl;
break;
}
else {
cout << "byte" << endl;
break;
}
}
}
}
}
else if(A.size() <= 5) {
string s = "32767";
if(A.size() < 5 || a == s) {
cout << "short" << endl;
}
else {
for(int i = 0;i < A.size();i++) {
if(A[i] == (s[i] - '0')) {
continue;
}
else {
if(A[i] > (s[i] - '0')) {
cout << "int" << endl;
break;
}
else {
cout << "short" << endl;
break;
}
}
}
}
}
else if(A.size() <= 10) {
string s = "2147483647";
if(A.size() < 10 || a == s) {
cout << "int" << endl;
}
else {
for(int i = 0;i < A.size();i++) {
if(A[i] == (s[i] - '0')) {
continue;
}
else {
if(A[i] > (s[i] - '0')) {
cout << "long" << endl;
break;
}
else {
cout << "int" << endl;
break;
}
}
}
}
}
else if(A.size() <= 19) {
string s = "9223372036854775807";
if(A.size() < 19 || a == s) {
cout << "long" << endl;
}
else {
for(int i = 0;i < A.size();i++) {
if(A[i] == (s[i] - '0')) {
continue;
}
else {
if(A[i] > (s[i] - '0')) {
cout << "BigInteger" << endl;
break;
}
else {
cout << "long" << endl;
break;
}
}
}
}
}
else {
cout << "BigInteger" << endl;
}
}
return 0;
}
B - Petya and Countryside
- 题意
有一个数组,选择一个点下雨,雨水会蔓延到相邻左右两点小于等于这个点的点,问最大的扩散长度。
- 思路
这题数据范围比较小直接暴力了,枚举每一个点左右两边更新最大值。
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1010;
int a[N];
int n;
int maxn;
int main() {
cin >> n;
for(int i = 1;i <= n;i++) {
scanf("%d", &a[i]);
}
for(int i = 1;i <= n;i++) {
int sum1 = 0,sum2 = 0;
for(int j = i;j < n;j++) {
if(a[j] < a[j + 1]) {
break;
}
else {
sum1++;
}
}
for(int k = i;k > 1;k--) {
if(a[k] < a[k - 1]) {
break;
}
else {
sum2++;
}
}
maxn = max(maxn,sum1 + sum2 + 1);
}
cout << maxn << endl;
return 0;
}