#创作计划#ACGO欢乐赛 #17题解
2024-03-11 19:28:01
发布于:浙江
T1 长方形
此题非常简单,只需要找出是否能配成2对相等数对就好了。
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
for(int ii=1;ii<=t;ii++){
long long a,b,c,d;
cin>>a>>b>>c>>d;
if(a==b&&c==d || a==c&&b==d || a==d&&b==c) cout<<"YES"<<endl;
else cout<<"N0"<<endl;
}
return 0;
}
T2 时间旅行
此题需要找规律。
(S代表起点,E代表终点)
当走5步时(假设),我们发现是走不了的。当我们走6步时,我们发现是可以的(左,上,右,右,右,右)。当我们走7步时,是不行的。
我们发现,当要求步数减去最快步数为奇数时,是不行的。当为偶数时,是可以的
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
for(int ii=1;ii<=t;ii++){
long long a,b,c,d,k;
cin>>a>>b>>c>>d>>k;
long long res=abs(a-c)+abs(b-d);
if(res<=k&&(k-res)%2==0) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
T3 月圆之夜
此题首先要算出自己几回合会死(因为自己的血量和对方的攻击力是不变的),然后将结果减1,就是你最晚杀死对方的回合数,算出即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
for(int ii=1;ii<=t;ii++){
int a,b,c;
cin>>a>>b>>c;
if(a>=c) cout<<-1<<endl;
else{
int res;
if(c%a==0) res=c/a;
else res=c/a+1;
res--;
int cmt;
if(b%res==0) cmt=b/res;
else cmt=b/res+1;
cout<<cmt<<endl;
}
}
return 0;
}
T4 海贼宝藏密码
此题需要找出最大的连续子串(得在首尾加上0和1001),然后遍历出来的最大值减2,就是可以删的子串。再用总和减去删去最大值即可。
#include<bits/stdc++.h>
using namespace std;
int a[1100];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
int maxn=0;
for(int i=1;i<=n;i++){
int res=1,t;
for(int j=i+1;j<=n;j++){
if(a[j]==a[j-1]+1) res++;
else{
t=j-1;
j=n+1;
}
if(a[j]==1000) t=j;
}
if(a[i]==1&&a[t]!=1000||a[t]==1000&&a[i]!=1) res++;
else if(a[i]==1&&a[t]==1000) res+=2;
res-=2;
if(res>maxn) maxn=res;
}
cout<<n-maxn;
return 0;
}
T5 加减乘除
此题是经典的24点问题,需要以下几步:
对于输入的四个数字,尝试所有可能的运算组合,包括加法、减法、乘法和除法。
对于每一种运算组合,调用函数,并将新生成的数字列表作为参数传入。
在递归调用中,继续尝试所有可能的运算组合,直到数字列表中只剩下一个数字。
如果最终得到的数字等于 24,则返回 true;否则返回 false。
主函数 main 中,依次读入每组数据,调用函数进行判断,并打印出结果。
#include<bits/stdc++.h>
using namespace std;
bool judge24(vector<double>& nums){
if(nums.size()==1) return fabs(nums[0]-24)<1e-6;
for(int i=0;i<nums.size();i++){
for(int j=0;j<nums.size();j++){
if(i!=j){
vector<double> next_nums;
for(int k=0;k<nums.size();k++){
if(k!=i&&k!=j) next_nums.push_back(nums[k]);
}
next_nums.push_back(nums[i]+nums[j]);
if(judge24(next_nums)) return true;
next_nums.pop_back();
next_nums.push_back(nums[i]*nums[j]);
if(judge24(next_nums)) return true;
next_nums.pop_back();
next_nums.push_back(nums[i]-nums[j]);
if(judge24(next_nums)) return true;
next_nums.pop_back();
if(nums[j]!=0){
next_nums.push_back(nums[i]/nums[j]);
if(judge24(next_nums)) return true;
next_nums.pop_back();
}
}
}
}
return false;
}
int main(){
int t;
cin>>t;
for(int ii=0;ii<t;ii++){
vector<int> nums(4);
for(int i=0;i<4;i++) cin>>nums[i];
vector<double> convert_nums;
for(int num:nums) convert_nums.push_back(static_cast<double>(num));
if(judge24(convert_nums)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
T6 强迫症序列
此题我只给出思路:
在本问题中,我们可以使用双指针的方法来寻找最小区间。具体步骤如下:
1初始化左指针和右指针都指向序列的第一个元素,同时初始化一个哈希表用来记录每个元素出现的次数。
2移动右指针,将遍历到的元素添加到哈希表中,如果发现有重复的元素,则说明出现了相邻的两个相同元素,记录下这一区间的长度,并更新最小区间的长度。
3移动左指针,直到删除一个元素后,使得区间内的元素不重复,即哈希表中对应元素的个数为1。
4不断重复步骤2和步骤3,直到右指针遍历完整个序列。
5输出最小区间的长度。
全部评论 2
顶1
2024-03-12 来自 浙江
0@AC君 求精
2024-03-11 来自 浙江
0
有帮助,赞一个