上海月赛2020年4月
丙组T1:https://www.iai.sh.cn/problem/24
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a, b, c, d;
cin >> a >> b >> c >> d;
int cnt = 0;
if(a >= 90) cnt++;
if(b >= 90) cnt++;
if(c >= 90) cnt++;
if(cnt >= 2 && d >= 85) cout << "Qualified";
else cout << "Not qualified";
return 0;
}
丙组T2:https://www.iai.sh.cn/problem/42
#include <bits/stdc++.h>
using namespace std;
int n, m;
char c[105][105];
int dx[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
int dy[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
//判断每一个格子,是否改变状态,如果改变状态则不稳定
int main()
{
bool yes = true;
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
cin >> c[i][j];
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
int live = 0; //周围8个存活的个数
int die = 0; //周围8个死亡的个数
for(int k = 0; k < 8; k++)
{
int nx = i + dx[k];
int ny = j + dy[k];
if(nx < 1 || nx > n || ny < 1 || ny > m) continue;
if(c[nx][ny] == '*') live++;
if(c[nx][ny] == '.') die++;
}
//下面两种情况会导致不稳定情况
if(c[i][j] == '*' && (live < 2 || live > 3)) yes = false;
if(c[i][j] == '.' && live == 3) yes = false;
}
}
if(yes) cout << "Still life";
else cout << "Other";
return 0;
}
丙组T3:https://www.iai.sh.cn/problem/33
#include <bits/stdc++.h>
using namespace std;
int n;
int a[100005];
long long ans;
//本题是要把每个城市的数字变成0
//所有无论是正数,还是负数,都需要变成0
//从头开始,对每一个城市的数字,将其变成0(工作量是当前数字的绝对值),只从后面一个城市的数字搬,
//后面一个城市的数字变成加上前一个城市的数字,直到最后
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i < n; i++)
{
ans += abs(a[i]);
a[i + 1] += a[i];
}
cout << ans;
return 0;
}
丙组T4:https://www.iai.sh.cn/problem/26
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int p = -1; //符号的位置
int n = 0; //数字的个数
int dn = 0; //小数点的个数
int xn = 0; //非法字符的个数
for(int i = 0; i < s.size(); i++)
{
if(s[i] == '+' || s[i] == '-')
{
p = i;
}
else if(s[i] == '.')
{
dn++;
}
else if(s[i] >= '0' && s[i] <= '9')
{
n++;
}
else xn++;
}
bool yes = true;
//必须有数字,整数和小数部分不能都省略
if(n == 0) yes = false;
//正负号必须在第一个
if(p > 0) yes = false;
//小数点只能有一个
if(dn > 1) yes = false;
//不能有非法字符
if(xn > 0) yes = false;
if(yes) cout << "Valid";
else cout << "Invalid";
return 0;
}
丙组T5:https://www.iai.sh.cn/problem/30
#include <bits/stdc++.h>
using namespace std;
int n, ans;
int a[1000005];
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1);
//双指针算法
//i枚举天,j枚举苹果
//先跳过过期的苹果,再吃一个苹果
for(int i = 1, j = 1; j <= n;i++) //i枚举天,j表示第几个苹果
{
while(j <= n && a[j] + 1 < i) j++; //跳过过期的
if(j <= n) ans++, j++; //吃一个
}
cout << ans;
return 0;
}