2019年燕山大学大学生程序设计大赛(一)
迷人的FT
T最近喜欢上了搭配,作为YSU最有潜力的搭配师,合理控制搭配成本是FT必须掌握的能力。现在FT需要完成一套搭配,但是他觉得挑选衣服很麻烦"这么低级的任务当然要交给计算机来做啊",FT如是说到。现在FT给了你n件衣服,每一件衣服有一个魅力值ai 。FT想要用最少的衣服完成一个魅力值至少为k的搭配方案。换句话说,你要选出一定数量的衣服,使得衣服魅力值之和不小于k 并且使得衣服数量最少。请你帮FT解决这个问题。
输入样例:
5 6
5 2 3 1 4
输出样例:
2
参考代码
/*
大致思路:为了使魅力值达到一定值且衣服最少,易知衣服的魅力值越大,需要其他的衣服就越少
所以排序即可 ,依次相加是否超过m ,
*/
#include<iostream>
#include<algorithm>
#include <set>
#include <string>
#include <cstdio>
using namespace std;
const int maxn = 1e5+5;
int n,m;
int a[maxn];
bool cmp(int a,int b){
return a>b;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)scanf("%d",&a[i]);
sort(a,a+n,cmp);
for(int i=0;i<n;++i){
m-=a[i];
if(m<=0){
cout<<i+1<<endl;
break;
}
}
if(m>0){
cout<<"YingYingYing\n";
}
cin>>n;
}
YSU复读机
Codeoos是USY_ACM群的管理员。Codeoos是一个段子手,因此他总会在群里说一些令人耳目一新的话。通常,这些话会引起群友的兴趣,然后有些群友会复读Codeoos说的话。但是,有很多时候,群友也会带 Codeoos的节奏。有些群友是专业复读机,可以把节奏带的飞起。Codeoos对此感到十分苦恼。所以,Codeoos准备对群友进行一些惩♂罚,包括禁言和T出群聊。请你帮Codeoos写一个程序,判定哪些群友要受到惩罚, 受到什么惩罚。 Codeoos对于复读机是这样判定的:
输入样例:
10 10
4 I'mveryvegetable
3 mywnb!
9 mywnb!
4 mywnb!
4 mywnb!
5 urclosed
10 sure
6 hhhh
2 qaq
1 qaq
输出样例:
1 9
4
参考代码
/*
大致思路:读取一个数据与前一个数据进行比较,为了去重可以使用set,再对禁言是否在退出群聊里中出现
注意输出格式。
*/
#include<iostream>
#include<algorithm>
#include <set>
#include <string>
#include <cstdio>
using namespace std;
const int maxn = 1e3+3;
set<int> a;//禁言
set<int> b;//退出群聊
int c[maxn];
int main(){
int n,m,index1,index2=0,inx=0;
cin>>n>>m;
string s1,s2="";
for(int i=0;i<m;++i){
cin>>index1>>s1;
if(s2==s1){
if(index1==index2){
b.insert(index1);
}else a.insert(index1);
}
index2=index1;
s2=s1;
}
set<int>::iterator it;
if(a.empty()){
cout<<-1<<endl;
}else{
for(it=a.begin();it!=a.end();++it){
if(b.find(*it)==b.end())c[inx++]=*it;
}
for(int i=0;i<inx;++i){
cout<<c[i]<<" ";
}
cout<<endl;
}
if(b.empty()){
cout<<-1<<endl;
}else{
for(it=b.begin();it!=b.end();++it){
cout<<*it<<" ";
}
cout<<endl;
}
}
爱转圈圈的Codeoos
Codeoos是一个喜欢运动的女孩子,她喜欢转圈圈玩。但是她转圈圈有几个原则:
只能向左转,并且在一个地方最多转一次。
Codeoos每次要绕一个圈,所以起点和终点一定要相邻。
Codeoos有强迫症,所以她每次的路径一定是一个矩形。
输入样例:
3
1 2
2 2
3 3
输出样例:
0
4
48
参考代码
/*
此题数据范围小,直接利用bfs搜索就行,由于有多组输入数据,利用一遍bfs把结果求出来。
*/
看到草原上奔跑的马儿了吗?
我已经爱上这片森林了。
你喜欢大海,我喜欢你。
Thematrix233看着这诗意的文字,心中十分高兴。这两句诗让他联想到了草原上飞奔的马儿。此时,Thematrix233心中突然想到一个疑问:如果给马儿一个足够大的草原,马儿去一个地方最短的时间是多少?他去向Codeoos询问这个问题。但是Codeoos只会在象棋棋盘上得到答案——但是这就够了!问题又来了:Codeoos只会研究标准棋盘的情况,一个很大的棋盘太大了,Codeoos算不出来。请你帮助Codeoos算出来马从原点跳到给定的点最少需要走几步?
输入样例:
3
1 2
2 2
5 5
输出样例:
1
4
4
参考代码
/*
此题数据范围小,直接利用bfs搜索就行,由于有多组输入数据,利用一遍bfs把结果求出来。
*/
#include<iostream>
#include<algorithm>
#include <queue>
#include <string>
#include <cstdio>
using namespace std;
const int maxn=2e3+3;
int pos[8][2]={{1,2},{2,1},{1,-2},{2,-1},{-1,2},{-2,1},{-1,2},{-2,-1}};
struct node{
int x,y,s;
node(int x,int y,int s):x(x),y(y),s(s){}
node(){}
};
int a[maxn][maxn];
queue<node> q;
void init(){
for(int i=0;i<maxn;++i){
for(int j=0;j<maxn;++j){
a[i][j]=-1;
}
}
a[1000][1000]=0;
node p(1000,1000,0);
q.push(p);
int x,y,s,xx,yy;
while(!q.empty()){
p=q.front();
q.pop();
x=p.x;y=p.y;s=p.s+1;
if(a[x][y]<p.s&&p.s!=0)continue;//优化
for(int i=0;i<8;++i){
xx = x+pos[i][0];
yy = y+pos[i][1];
if(xx>=maxn||xx<0||yy>=maxn||yy<0)continue;
if(a[xx][yy]>s||a[xx][yy]==-1){
a[xx][yy]=s;
q.push(node(xx,yy,s));
}
}
}
}
int main(){
init();
int t,x,y;
scanf("%d",&t);
while(t--){
scanf("%d%d",&x,&y);
printf("%d\n",a[x+1000][y+1000]);
}
}
Codeoos下象棋
Codeoos是一个有智慧的女孩子,她从小就喜欢下中国象棋。Codeoos十分喜欢使用車。(車可以在棋盘上在没有阻挡并且不走出棋盘的情况下沿一条直线走任意距离)。
维基百科对于車的介绍:“车”在没有其他棋子阻挡的情况下每一步可以沿着直线横走或直走任意步,步数不限,不可斜走或拐弯。吃子方式与走法相同,即每一步在其可允许行走的方向上如果有对方的棋子,就可以将它吃掉。
在整个棋局中,“车”通常被认为是攻击力最强的棋子,有“一车十子寒”之称。残局时若我方有车在场,应战不成问题;若仅有我方有车,则常可稳操左券。
现在Codeoos给了你一张很大的棋盘,他想计算一下一个車要到达目标点,需要走的距离。
输入样例:
1
1 2 9 10
输出样例:
16
参考代码
/*
此题直接“车”的移动特点,最多移动两次,最少距离为曼哈顿距离。
*/
#include<iostream>
#include<algorithm>
#include <set>
#include <string>
#include <cstdio>
using namespace std;
int main(){
int t;
long long x1,x2,y1,y2;
cin>>t;
while(t--){
cin>>x1>>y1>>x2>>y2;
cout<<abs(x1-x2)+abs(y1-y2)<<endl;
}
}