/*
创建人:小白
创建时间:20180209
页数:P2
题目:抽签
限制条件:
1<=n<=50
1<=m<=10^8
1<=ki<=10^8
*/
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 50;
int main(){
int n,m,k[MAX_N];
cin>>n>>m;
for(int i = 0;i<n;i++)
cin>>k[i];
bool f = false;
for(int a = 0;a<n;a++)
for(int b=0;b<n;b++)
for(int c=0;c<n;c++)
for(int d=0;d<n;d++)
if(k[a]+k[b]+k[c]+k[d] == m)
f = true;
if(f) cout<<"Yes";
else cout<<"No";
return 0;
}
/*
创建人:小白
创建时间:20180209
页数:P16
题目:三角形
限制条件:
3<=n<=100
1<=ai<=10^6
*/
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 100;
int n,a[MAX_N];
void solve(){
int ans = 0;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
for(int k = j+1;k<n;k++){
int len = a[i] + a[j] + a[k];
int ma = max(a[i],max(a[j],a[k]));//求最长的边
int rest = len - ma;//两边之和
if(ma<rest){//两边之和大于最长边
ans=max(ans,len);//周长
}
}
cout<<ans;//不能构成三角形则输出0
}
int main(){
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
solve();
return 0;
}
/*
创建人:小白
创建时间:20180210
页数:P18
题目:Ants(POJ NO.1852)
限制条件:
1<=l<=10^6
1<=n<=10^6
0<=xi<=L
*/
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 100;
int L,n;
int x[MAX_N];
void solve(){
//计算最短时间
int minT = 0;
for(int i=0;i<n;i++)
minT = max(minT,min(x[i],L - x[i]));
//计算最长时间
int maxT = 0;
for(int i =0;i<n;i++)
maxT = max(maxT,max(x[i],L-x[i]));
cout<<"minT="<<minT<<endl<<"maxT="<<maxT;
}
int main(){
cin>>L>>n;
for(int i=0;i<n;i++)
cin>>x[i];
solve();
return 0;
}
/*
创建人:小白
创建时间:20180210
页数:P20
题目:抽签(算法改进)
限制条件:
1<=n<=1000
1<=m<=10^8
1<=ki<=10^8
时间复杂度:排序O(nlogn) 循环O(n^3logn) 总:O(n^3logn)
*/
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 50;
int n,m,k[MAX_N];
//bool binary_search(int x){
// x的存在范围是k[l],k[k+1],...,k[r-1]
// int l=0,r=n;
// while(r-l>=1){//反复操作直到存在范围为空
// int i = (l+r)/2;
// if(k[i] == x)
// return true;
// else if(k[i] < x)
// l = i+1;
// else
// r=i;
// }
// return false;//没找到x
//}
void solve(){
sort(k,k+n);
bool f = false;
for(int a=0;a<n;a++)
for(int b=0;b<n;b++)
for(int c=0;c<n;c++)
if(binary_search(k,k+n,m-k[a]-k[b]-k[c]))
f = true;
if(f)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
int main(){
cin>>n>>m;
for(int i = 0;i<n;i++)
cin>>k[i];
solve();
return 0;
}
/*
创建人:小白
创建时间:20180210
页数:P23
题目:抽签(算法改进)
限制条件:
1<=n<=1000
1<=m<=10^8
1<=ki<=10^8
时间复杂度:排序O(nlogn) 循环O(n^2logn) 总:O(n^2logn)
*/
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 50;
int n,m,k[MAX_N];
int kk[MAX_N * MAX_N];
void solve(){
//枚举k[c]+k[d]的和
for(int c=0;c<n;c++)
for(int d = 0;d<n;d++)
kk[c*n+d] = k[c] + k[d];
sort(kk,kk+n*n);
bool f = false;
for(int a=0;a<n;a++)
for(int b=0;b<n;b++)
if(binary_search(kk,kk+n,m - k[a] -k[b]))
f = true;
if(f)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
int main(){
cin>>n>>m;
for(int i = 0;i<n;i++)
cin>>k[i];
solve();
return 0;
}
挑战程序设计竞赛第2版-第一章
最新推荐文章于 2019-07-07 02:37:27 发布