USACO铜组测试1
1.ABC问题
因为(A <= B <= C 且为正整数),所以数组中最小的一定是A,第二小的一定是B,最大的一定是A+B+C。
#include <bits/stdc++.h>
using namespace std;
int a[15];
int main(){
freopen("abc.in","r",stdin);
freopen("abc.out","w",stdout);
for(int i=1;i<=7;++i)
cin >> a[i];
sort(a+1,a+7+1);
cout << a[1] << " ";
cout << a[2] << " ";
cout << a[7]-a[1]-a[2] << endl;
fclose(stdin);
fclose(stdout);
return 0;
}
2.雏菊花环
枚举
枚举每一个区间的第一位和最后一位,循环时就打一个map标记哪些花是有的,总和也随之累加,每次计算一下平均数就行了。
#include <bits/stdc++.h>
using namespace std;
int n,a[110],ans=0;
map<int,bool> mymap;
int main(){
freopen("daisy.in","r",stdin);
freopen("daisy.out","w",stdout);
cin >> n;
ans=n;
for(int i=1;i<=n;++i)
cin >> a[i];
int k=0;
for(int i=1;i<=n;++i){
mymap[a[i]]=1;
k=a[i];
for(int j=i+1;j<=n;++j){
mymap[a[j]]=1;
k+=a[j];
if(k%(j-i+1)!=0)
continue;
if(mymap[k/(j-i+1)]==1)
ans++;
}
mymap.clear();
}
cout << ans << endl;
fclose(stdin);
fclose(stdout);
return 0;
}
3.一成不变
枚举
首先将所有朝向N和朝向E的奶牛分开来讨论(pathu是朝北的奶牛,pathr是朝东的奶牛),再按坐标排个序,对于每一只向东走的奶牛,枚举所有向北走的奶牛,如果不可能阻隔,直接continue,否则判断是哪一只奶牛被阻隔了,这只奶牛有没有被其他的奶牛阻隔,如果没有,就可以得出ans,用vh标记一下奶牛被阻隔了即可。
#include <bits/stdc++.h>
using namespace std;
struct nod{
int x;
int y;
int id;
nod(int _x=0,int _y=0,int _id=0):x(_x),y(_y),id(_id){}
};
int n,a,b,ans[60];
bool vh[60];
vector<nod> pathr;
vector<nod> pathu;
char c;
vector<nod> g[60];
bool cmp1(nod p,nod q){
return p.x<q.x;
}
bool cmp2(nod p,nod q){
return p.y<q.y;
}
int main(){
freopen("stuct.in","r",stdin);
freopen("stuct.out","w",stdout);
cin >> n;
for(int i=1;i<=n;++i)
ans[i]=INT_MAX;
for(int i=1;i<=n;++i){
cin >> c >> a >> b;
if(c=='N')
pathu.push_back(nod(a,b,i));
else
pathr.push_back(nod(a,b,i));
}
sort(pathu.begin(),pathu.end(),cmp1);
sort(pathr.begin(),pathr.end(),cmp2);
for(int i=0;i<pathr.size();++i){
for(int j=0;j<pathu.size();++j){
if(pathu[j].x<pathr[i].x || pathu[j].y>pathr[i].y)
continue;
if(pathu[j].x-pathr[i].x==pathr[i].y-pathu[j].y)
continue;
if(pathu[j].x-pathr[i].x>pathr[i].y-pathu[j].y){
if(vh[pathu[j].id]==1)
continue;
ans[pathr[i].id]=min(ans[pathr[i].id],pathu[j].x-pathr[i].x);
vh[pathr[i].id]=1;
}
else{
if(vh[pathr[i].id]==1)
continue;
ans[pathu[j].id]=min(ans[pathu[j].id],pathr[i].y-pathu[j].y);
vh[pathu[j].id]=1;
}
}
}
for(int i=1;i<=n;++i){
if(ans[i]!=INT_MAX)
cout << ans[i] << endl;
else
cout << "Infinity" << endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}