第1章蓄势待发准备篇
Posted 辉小歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第1章蓄势待发准备篇相关的知识,希望对你有一定的参考价值。
194. 抽签(挑战程序设计竞赛)【爆搜】
https://www.papamelon.com/problem/194
数据范围很小,直接爆搜即可。当然也可以写4层for循环。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int a[N],n,m,flag;
void dfs(int u,int sum)
if(flag) return;
if(u==4)
if(sum==m) flag=1;
return;
for(int i=0;i<n;i++) dfs(u+1,sum+a[i]);
int main(void)
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
dfs(0,0);
if(flag) puts("Yes");
else puts("No");
return 0;
192. 三角形(挑战程序设计竞赛)【枚举】
https://www.papamelon.com/problem/192
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N],n,ans;
void check(int a,int b,int c)
if(a+b<=c) return;
if(a+c<=b) return;
if(b+c<=a) return;
int sum=a+b+c;
ans=max(ans,sum);
int main(void)
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
for(int z=j+1;z<n;z++)
check(a[i],a[j],a[z]);
cout<<ans;
193. 蚂蚁(挑战程序设计竞赛)【思维】
https://www.papamelon.com/problem/193
其实蚂蚁a和蚂蚁b碰头,本质上就是两者就换了位置,b变成了a,a变成了b。所以撞上,可以等价于传过去。
故直接枚举,存一下最长的或最短的距离即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long int LL;
LL a[N];
int main(void)
int t; cin>>t;
while(t--)
LL l,n; scanf("%lld%lld",&l,&n);
for(int i=0;i<n;i++) scanf("%lld",&a[i]);
LL minv=0,maxv=0;
for(int i=0;i<n;i++)
minv=max(minv,min(a[i],l-a[i])),maxv=max(maxv,max(a[i],l-a[i]));
cout<<minv<<" "<<maxv<<endl;
return 0;
200. 抽签 II(挑战程序设计竞赛)【思维 哈希表 枚举】
https://www.papamelon.com/problem/200
分析:暴力4层for循环,时间复杂度太大了,会超时。
剪枝,用哈希表存一下所有的数,用3层的for循环,剩下的值直接查找哈希表即可。这样可不行。
再次剪枝,先预处理所有的2个数的组合,然后2层的for循环枚举,剩下的值直接差哈希表即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int a[N],n,m;
unordered_map<int,int>mp;
int main(void)
cin>>n>>m;
bool flag=0;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
mp[a[i]+a[j]]++;
for(int i=0;i<n;i++)
if(a[i]>=m) continue;
for(int j=0;j<n;j++)
int sum=a[i]+a[j];
if(mp[m-sum]) flag=1;
if(flag) break;
if(flag) puts("Yes");
else puts("No");
return 0;
以上是关于第1章蓄势待发准备篇的主要内容,如果未能解决你的问题,请参考以下文章