C-传染病统计
题目描述
输入描述
输出描述
输入样例
3
2
3 6
3
1 3 5
5
1 2 5 6 7
输出描述
1 1
3 3
2 3
数据范围极小的普通签到题,通过距离是否大于 2 分为多个连通块(?),并统计每个连通块中的人数并更新答案即可。
参考代码
#include <bits/stdc++.h>
using namespace std;
int a[10],d[10];
int main(){
int t,n;
cin >> t;
while(t--){
cin>>n;
cin>>a[0];
for(int i=1;i<n;i++){
cin>>a[i];
d[i-1]=a[i]-a[i-1];
}
int resMax=-1,resMin=8,cnt=0;
for(int i=0;i<n-1;i++){
cnt=0;
while(d[i]<=2&&i<n-1){
cnt++;
i++;
}
resMax=max(resMax,cnt);
resMin=min(resMin,cnt);
}
cout<<resMin+1<<' '<<resMax+1<<endl;
}
return 0;
}
D-阿强与网格
题目描述
输入描述
输出描述
输入样例
3
5 6 2 5
4 7 5 6
7 8 6 5
输出样例
18
33
36
贪心,每进行一次对角线方向的走法其实等价于两次直线方向走法,比较两种方法的价格,同时需要特判网格的特殊形状。
本题卡快读(可恶),考虑由 scanf 读入。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
signed main(){
int t;scanf("%d",&t);
ll n,m,x,y;ll ans;
while(t--){
scanf("%lld%lld%lld%lld",&n,&m,&x,&y);
if(m>n)swap(n,m);
if(m==1){
ans=(n-1ll)*x;
}else if(2ll*x<=y){
ans=(n+m-2ll)*x;
}else if(x<=y){
ans=(n-m)*x+(m-1ll)*y;
}else if((n-m)&1){
ans=(n-2ll)*y+x;
}else{
ans=(n-1ll)*y;
}
printf("%lld\n",ans);
}
return 0;
}
E-生活大爆炸
题目描述
输入描述
输出描述
输入样例
5 2 5
输出样例
10
数学组合问题,毕竟高中都学过手模一下就好了嘛 ,注意处理相同方案多次计算的问题。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll C[65][65];
int main(){
int n,m,t;
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];
}
cin >> n >> m >> t;
ll 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 << endl;
return 0;
}
F-Capslock
题目描述
输入描述
输出描述
输入样例1
cAPS
输出样例1
Caps
输入样例2
Lap
输出样例2
Lap
对各种情况模拟即可,注意 asc 码中大写字母在小写字母之前。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int flag=0;
string s;
cin>>s;
for(int i=1;i<s.size();i++)
if(s[i]>'Z')
flag=1;
if(flag==0){
if(s[0]>'Z')
s[0]-='a'-'A';
else s[0]+='a'-'A';
for(int i=1;i<s.size();i++)
s[i]+='a'-'A';
cout<<s<<endl;
}
else
cout<<s<<endl;
return 0;
}
G-字节类型
题目描述
输入描述
输出描述
输入样例1
127
输出样例1
byte
输入样例2
123456789101112131415161718192021222324
输出样例2
BigInteger
由于都是正整数,因此比较大小即可。考虑用 __int128 进行转换,在 __int128 范围内且大于 long long 范围的则输出 BigInteger,否则逐级比较。
为了避免麻烦,长度大于 20 的直接输出即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
string a;
__int128 x=0;
int main()
{
cin>>a;
int len=a.size();
if(len>=20){
printf("BigInteger\n");
return 0;
}
for(int i=0;i<len;i++){
x=x*10+a[i]-'0';
}
if(x>9223372036854775807)printf("BigInteger\n");
else if(x>147483647)printf("long\n");
else if(x>32767)printf("int\n");
else if(x>127)printf("short\n");
else printf("byte\n");
return 0;
}
L-神奇的回答
题目描述
输入描述
输出描述
输入样例
4
19
14
4
122
输出样例
18
14
4
18
不会吧?这题都要讲吗?
人人都会的代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
while(n--){
int x;
cin>>x;
if(x>=18)
cout<<18<<endl;
else
cout<<x<<endl;
}
}