(https://ac.nowcoder.com/acm/contest/95928)(比赛链接)
目录
A.三途川的摆渡人
1.思路
统计字符串中字符'0'的个数即可,可以用c++中count函数实现
2.函数
std::count(s.begin(), s.end(), '0'); // 所要统计的容器的起止范围,所要统计的字符
3.代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main(){
int n;
cin>>n;
int count = 0;
string s;
cin>>s;
for(int i=0;i<n;i++){
if(s[i]-'0'==0){
count++;
}
}
cout<<count<<endl;
return 0;
}
B.魔法之森的蘑菇
1.思路
利用二维数组存储所有数据,利用六层for循环进行遍历,枚举所有情况。最外两层for循环是矩阵的起始位置,三四层for循环是矩阵的终止位置,最后两层for循环则是遍历其中的所有元素,判断是否满足题目要求,不断更新结果即可
2.代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 35;
char a[N][N];
signed main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
int ans = 0;
int t1,t2,t3,t4;
for(int x1=1;x1<=n;x1++){
for(int y1=1;y1<=m;y1++){
for(int x2=1;x2<=n;x2++){
for(int y2=1;y2<=m;y2++){
int t = 0;
int flag = 0;
for(int i=x1;i<=x2;i++){
for(int j=y1;j<=y2;j++){
if(a[i][j]=='.'){
t++;
}else{
flag=1;
}
}
}
if(flag==0){
if(t>ans){
ans = t;
t1 = x1;
t2 = y1;
t3 = x2;
t4 = y2;
}
}
}
}
}
}
cout<<t1<<" "<<t2<<" "<<t3<<" "<<t4<<endl;
return 0;
}
C.迷途之家的大贤者
1.思路
反向思考,不去想小红和小紫可能删除什么数,而是思考小红和小紫可能剩余什么数,这样就可以通过n-剩余的数的数量来反向求出操作的次数。小红和小紫会优先剩余自己不重复的数,然后再剩余两者不重复的数。这段代码我不是很能理解这个c.size()/2的操作
2.代码(取自https://ac.nowcoder.com/acm/contest/view-submission?submissionId=73375800)
#include <bits/stdc++.h>
#define int long long
using namespace std;
set<int> a,b,c;
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int t;
cin>>t;
a.insert(t);
c.insert(t);
}
for(int i=1;i<=n;i++){
int t;
cin>>t;
b.insert(t);
c.insert(t);
}
cout<<n-min(min(a.size(),b.size()),c.size()/2)<<endl;
return 0;
}
D.红魔馆的馆主
1.思路
首先考虑如何对题目中的ai进行存储统计它们的数量同时降低复杂度,a[i]表示对495取余后余数为i的元素的个数和。即存储它们对495取余的结果,即数据495和990表示a[0](495%495==0,990%495==0)。其次考虑如何实现对某个元素加1,如果两个数x、y%495的余数相同,那说明它们加1后的结果是等价的。即x+1的情况和y+1的情况可以看着一样的
因此,第一层for循环从0到494,相当于枚举所有的情况,当a[t]不为空时,a[t]元素个数进行加1操作,对应的另一个元素a[(t+1)%495]就减1。内层两个for循环则是对结果数量进行统计,当i==j则是等差数列求和,i!=j,a[i]中所有数量的元素都可以跟a[j]中所有数量的元素匹配,因此贡献和为成绩(增加贡献的前提是i*j%495==0)
2.代码(取自https://ac.nowcoder.com/acm/contest/view-submission?submissionId=73377860)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 500;
int a[N];
signed main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int t;
cin>>t;
a[t%495]++;
}
int ans = 0;
for(int t=0;t<495;t++){
int flag = 0;
int re = 0;
if(a[t]!=0){
a[t]--;
a[(t+1)%495]++;
flag = 1;
}
for(int i=0;i<495;i++){
for(int j=i;j<495;j++){
if(i==j){
if(i*j%495==0){
re += (a[i]*(a[i]-1)/2);
}
}else{
if(i*j%495==0){
re += a[i]*a[j];
}
}
}
}
if(flag==1){
a[t]++;
a[(t+1)%495]--;
}
ans = max(ans,re);
}
cout<<ans<<endl;
return 0;
}
E、F
下次一定~