WAWA大哭, 弱鸡七题摘银准备退役...
感谢队友方大师和棋兄的鼎力相助
C | 传染病统计https://ac.nowcoder.com/acm/contest/22352/C |
阿强来到大街上,街上有 N 个人,编号为 1 ∼N 。简单起见,我们把每个人都看成一条线上的一个点。对每个合法的 i,第 i 个人的位置是 xi。
这些人当中恰好有一个感染了 COVID-19,但我们不知道是哪一个。当一个被感染的人和一个未被感染的人之间的距离不超过 2 时,病毒会从前者传播到后者。如果我们等待足够长的时间,会有一些人(这些人由第一个感染者确定)被感染;这些人的数量被称作最终被感染的人数。
阿强希望求出最终被感染的人数的最小和最大可能的值,也就是最好和最坏情况下这个数的值。
第一行包含一个整数T(1≤T≤2,000),表示数据组数。接下来是T组数据。 •每组数据的第一行包含一个整数N(2≤N≤8)。 •第二行包含N个整数x1,x2,…,xn(0≤xi≤10)用空格隔开。
对于每组数据,输出一行包含两个整数,用空格隔开,表示最终被感染的人数的最小值和最大值。
示例1
3 2 3 6 3 1 3 5 5 1 2 5 6 7
1 1 3 3 2 3
#include
using namespace std;
int a[10],d[10];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t,n;
cin >> t;
while(t--)
{
cin>>n;
cin>>a[0];
for(int i=1;i>a[i];
d[i-1]=a[i]-a[i-1];
}
int resMax=-1,resMin=8,cnt=0;
for(int i=0;i
D | 阿强与网格https://ac.nowcoder.com/acm/contest/22352/D |
阿强在一个N行M列的网格中。
阿强可以用两种方式移动:
向下、向左、向上或向右移动,每次移动的代价为X。换句话说,如果您位于网格的单元格(i,j),则可以转到任意单元格(i+1,j),(i,j−1) ,(i−1,j)或(i,j+1),代价为X。
沿对角线向左下、向右下、向左上、向右上移动成本为Y。换句话说,如果你在网格的单元格(i,j)上,你可以去任意一个单元格(i+1,j−1) ,(i+1,j+1),(i−1,j−1) 或(i−1,j+1),代价为Y。
请你找到从阿强从左上角(1,1)到右下角(N,M)的最小成本。
阿强不能移出网格。
第一行一个整数T(1≤T≤5∗10^5)表示数据组数。
接下来T行每行四个整数N,M,X,Y(1≤N,M,X,Y≤10^6)
对于每组数据一行表示答案。
示例1
3 5 6 2 5 4 7 5 6 7 8 6 5
18 33 36
纯模拟就好
#include
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while(T--){
long long N,M,X,Y;
long long ans = 0;
cin >> N >> M >> X >> Y;
N--,M--;
long long MIN = min(N,M);
long long MAX = max(N,M);
long long len = MAX - MIN;
if(N && M){
if(Y >= 2 * X){
ans += (N + M) * X;
}else if(Y >= X){
ans += Y * MIN;
ans += len * X;
}else{
if(len & 1){
ans += Y * MIN;
ans += Y * (len - 1);
ans += X;
}else{
ans += Y * MAX;
}
}
}else{
ans += X * MAX;
}
cout << ans << '\n';
}
return 0;
}
E | 生活大爆炸https://ac.nowcoder.com/acm/contest/22352/E |
有n个男孩和m个女孩参加戏剧俱乐部。要制作一部戏剧《生活大爆炸》,他们需要选择一组由t个演员组成的剧组,其中包括不少于4名男孩和不少于1名女孩。有多少种方法可以组成一个小组?当然,只有剧团组成不同的变体才被认为是不同的。
一行包含三个整数n,m,t (4 ≤n≤30, 1 ≤m≤ 30, 5 ≤t≤n+m)
一行表示答案。
示例1
5 2 5
10
#include
using namespace std;
long long C[65][65];
void solve(){
for(int i = 0;i <= 65;i++){
for(int j = 0;j <= i;j++){
if(!j){
C[i][j] = 1;
}else
C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,m,t;
solve();
cin >> n >> m >> t;
long long ans = 0;
for(int i = 4;i <= n;i++){
for(int j = 1;j <=m;j++){
if(i + j == t){
ans += C[n][i] * C[m][j];
}
}
}
cout << ans << '\n';
return 0;
}
F | Capslockhttps://ac.nowcoder.com/acm/contest/22352/F |
Caps lock是一种计算机键盘键。按此键可设置输入模式,默认情况下,键入的字母为大写。如果它是偶然按下的,它就会产生一些事故。
让我们考虑键入一个字符时Caps lock键意外打开的情况,如果:
1、它只包含大写字母;
2、除第一个字母外,所有字母都是大写的。
在这两种情况下,我们应该更改所有字母的大小写。例如,单词“hELLO”、“HTTP”、“z”的单词大小写应该改变。
编写一个应用上述规则的程序。如果无法应用规则,程序应保持单词不变。
第一行包含一个由大写和小写字母组成的单词。单词的长度小于等于100。
打印单词的处理结果。
示例1
cAPS
Caps
示例2
Lap
Lap
#include
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
string s;
cin >> s;
int len = s.size();
bool ok = true;
for(int i=1; i 'Z'){
ok = false;
break;
}
}
string a;
if(ok){
if(s[0] >= 'A' && s[0] <= 'Z'){
cout << (char)(s[0] + 32);
}else{
cout << (char)(s[0] - 32);
}
for(int i=1;i
G | 字节类型https://ac.nowcoder.com/acm/contest/22352/G |
阿强参加了一个编程大赛。他想要选用一个语言作为自己的主要编程语言。因为他喜欢非常大的数,所以他选用了java。它有一个非常大的整数数据类型,称为BigInteger。
但是写了几道题后,Petya意识到并非所有任务都需要使用BigInteger类型。实际上有时候小范围的数更利于编程。这就是为什么会出现一个问题:“如果要存储正整数n,应该使用哪种整数类型?”
阿强只知道5种整数类型:
1) byte占用1个字节,允许存储来自 - 128至127
2) short占用2个字节,允许存储来自的数字 - 32768至32767
3) int占用4个字节,允许从中存储数字 - 2147483648至2147483647
4) long占用8个字节,允许存储来自 - 9223372036854775808至9223372036854775807
5) BigInteger可以存储任何整数,但它不是一个基元类型,使用它的操作要慢得多。
对于上面给出的所有类型,边界值都包含在值范围内。
从这个列表中,阿强想存储整数n,并且想选择占用字节数最小的类型。由于BigInteger的工作速度慢得多,阿强认为它是占用最多的一个。
第一行包含一个正数n。它由不超过100位数字组成,不包含任何前导零。数字n不能表示为空字符串。
一行包含一个字符串,字符串在"byte,short,int,long,BigInteger”中产生,表示能存储下n的占用字节数最小的类型
示例1
127
byte
示例2
123456789101112131415161718192021222324
BigInteger
这题笑死,硬核判断,居然没有TLE,早知道用Python了....
#include
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
string s, a;
int rua = 0;
cin >> s;
bool ok = true;
if (s[0] == '-') {
a = s.substr(1, s.size());
rua = 1;
} else {
a = s;
}
int len = a.size();
if (len < 3) {
cout << "byte"
<< "\n";
} else if (len == 3) {
if (a[0] - '0' <= 1)
if (a[1] - '0' <= 2)
if (a[2] - '0' <= 7 + rua){
cout << "byte"
<< "\n";
ok = false;
}
if(ok)
cout << "short"
<< "\n";
} else if (len < 5) {
cout << "short"
<< "\n";
} else if (len == 5) {
if (a[0] - '0' <= 3)
if (a[1] - '0' <= 2)
if (a[2] - '0' <= 7)
if (a[3] - '0' <= 6)
if (a[4] - '0' <= 7 + rua){
cout << "short"
<< "\n";
ok = false;
}
if(ok)
cout << "int"
<< "\n";
} else if (len < 10) {
cout << "int"
<< "\n";
} else if (len == 10) {
if (a[0] - '0' <= 2)
if (a[1] - '0' <= 1)
if (a[2] - '0' <= 4)
if (a[3] - '0' <= 7)
if (a[4] - '0' <= 4)
if (a[5] - '0' <= 8)
if (a[6] - '0' <= 3)
if (a[7] - '0' <= 6)
if (a[8] - '0' <= 4)
if (a[9] - '0' <= 7 + rua){
cout << "int"
<< "\n";
ok = false;
}
if(ok)
cout << "long"
<< "\n";
} else if (len < 19) {
cout << "long"
<< "\n";
} else if (len == 19) {
if (a[0] - '0' <= 9)
if (a[1] - '0' <= 2)
if (a[2] - '0' <= 2)
if (a[3] - '0' <= 3)
if (a[4] - '0' <= 3)
if (a[5] - '0' <= 7)
if (a[6] - '0' <= 2)
if (a[7] - '0' <= 0)
if (a[8] - '0' <= 3)
if (a[9] - '0' <= 6)
if (a[10] - '0' <= 8)
if (a[11] - '0' <= 5)
if (a[12] - '0' <= 4)
if (a[13] - '0' <= 7)
if (a[14] - '0' <= 7)
if (a[15] - '0' <= 5)
if (a[16] - '0' <= 8)
if (a[17] - '0' <= 0)
if (a[18] - '0' <= 7 + rua){
cout << "long"
<< "\n";
ok = false;
}
if(ok)
cout << "BigInteger"
<< "\n";
} else
cout << "BigInteger"
<< "\n";
return 0;
}
I | 完美主义https://ac.nowcoder.com/acm/contest/22352/I |
阿强采摘了一些苹果,并把他们分堆排成了一行,从左往右编号为第 1 … 堆,其中第堆苹果有ai个。
完美主义者阿珍看到这些苹果,觉得他们摆放的非常杂乱。她要求阿强进行如下的操作。
对某堆苹果进行调整:阿强将会将第堆苹果调整成bi个;
对阿珍询问做出答复:其中每次询问表示为[, ],表示询问第堆到第堆之间的苹果数量是否满足al≤al+1≤⋯≤ar−1≤ar,如果满足则称为完美。
第一行两个整数n, q (1≤n,q≤3∗10^5),表示苹果的堆数和操作的个数;
第二行n个整数表示ai。
以下行,每行3个整数,第一个整数为opt;
若opt = 1,之后两个整数i, bi,表示将第堆苹果调整为bi个;
若opt = 2,之后两个整数, ,表示对[, ]之间的苹果堆进行询问。
(1≤ai,bi≤10^9)
输出一共行,每行一个 Yes 或者 No,表示每个询问对应区间是否完美。
示例1
7 4 1 2 2 4 3 4 5 1 1 4 2 1 7 2 6 7 2 4 7
No Yes No
线段树
#include
using namespace std;
const int maxn = 3 * 100005;
int a[maxn];
struct segtree{
bool ok;
int l;
int r;
}tr[maxn << 2];
void pushup(int rt){
tr[rt].ok = (tr[rt << 1].ok && tr[rt << 1 | 1].ok)&&(tr[rt << 1].r <= tr[rt << 1 | 1].l);
tr[rt].l = tr[rt << 1].l;
tr[rt].r = tr[rt << 1 | 1].r;
}
void build(int l,int r,int rt){
if(l == r){
tr[rt].l = tr[rt].r = a[l];
tr[rt].ok = true;
return ;
}
int mid = (l + r) >> 1;
build(l,mid,rt << 1);
build(mid + 1,r,rt << 1 | 1);
pushup(rt);
}
void update(int t,int l,int r,int C,int rt){
if(l == r){
tr[rt].l = tr[rt].r = C;
return ;
}
int mid = (l + r) >> 1;
if(t <= mid)update(t,l,mid,C,rt << 1);
else update(t,mid + 1,r,C,rt << 1 | 1);
pushup(rt);
}
bool query(int L,int R,int l,int r,int rt){
if(L <= l && r <= R){
return tr[rt].ok;
}
bool ok = true;
int mid = (l + r) >> 1;
if(L <= mid) ok = (ok && query(L,R,l,mid,rt << 1));
if(R > mid) ok = (ok && query(L,R,mid + 1,r,rt << 1 | 1));
if(L <= mid && R > mid){
ok = (ok && (tr[rt << 1].r <= tr[rt << 1 | 1].l));
}
return ok;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,q;
cin >> n >> q;
for(int i=1;i<=n;i++){
cin >> a[i];
}
build(1,n,1);
while(q--){
int x;
cin >> x;
if(x == 1){
int t,C;
cin >> t >> C;
update(t,1,n,C,1);
}else{
int l,r;
cin >> l >> r;
if(query(l,r,1,n,1)){
cout << "Yes" << '\n';
}else{
cout << "No" << '\n';
}
}
}
return 0;
}
L | 神奇的回答https://ac.nowcoder.com/acm/contest/22352/L |
阿强对年龄问题很敏感。每当被问及年龄的时候,他总想要逃避。于是当他18岁以下的时候,别人问他多少岁,他会如实回答,当他年龄大于18时候,他会回答:18。
他坐着时光机穿越到不同的年份,他知道自己穿越后的年龄。那么当他穿越后别人问他年龄的时候他应该怎么回答呢?
第一行一个整数n(1≤n≤100000)。表示穿越时光机的次数。 接下来n行每行一个整数x(1≤x≤100000)表示穿越后的年龄。
共n行,每行一个整数表示一次穿越后回答的年龄。
示例1
4 19 14 4 122
18 14 4 18
签到题
#include
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin >> T;
while(T--){
int x;
cin >> x;
if(x >= 18){
cout << 18 << '\n';
}else{
cout << x << '\n';
}
}
return 0;
}