http://xcacm.hfut.edu.cn/contest.php?cid=1009
打了一下午,最后一道题2333,前面比较基础。
问题 A: 求成绩最大值和最小值
题目描述
GX是宣城校区A班的一名同学,如果GX在B班的话,那么这两个班的平均成绩都会提高.现在给出A班与B班的人数以及成绩,求GX成绩可能的最大值和最小值。
输入
第一行有两个正整数n(2 <= n <= 50) 和m(1 <= m <= 50),分表代表A班与B的人数
第二行有n-1个数,表示A班中除了GX,其他n-1人的成绩(每个人的成绩都为正整数,且小于100)
第三行有m个数,表示B班m个人的成绩
输出
对于每组数据,输出一行,包含两个数,分别为GX成绩可能的最小值和最大值,不存在输出-1 -1
样例输入
样例输出
#include<iostream> #include<cstdio> using namespace std; int d[100]; int c[100]; int main() { int a,b,i,j,n,m,sum=0,num=0,max=0,min=0; while(~scanf("%d%d",&n,&m)) { min=0;max=0;a=0;b=0;j=0;sum=0;num=0; for(i=1;i<n;i++) {scanf("%d",&d[i]);sum+=d[i];} for(i=1;i<=m;i++){scanf("%d",&c[i]);num+=c[i];} a=sum/(n-1); j=sum%(n-1); b=num/m; if(a==b||a<b){cout<<"-1"<<" "<<"-1"<<endl;continue;} if(j>0){max=a;} else if(j==0){max=a-1;} min=b+1; if(min>max){cout<<"-1"<<" "<<"-1"<<endl;continue;} cout<<min<<" "<<max<<endl; } return 0; }
问题 B: 打扫房间
题目描述
某天,老师派GX去打扫一间神秘的空房间,这间房间的地面有n*n块地砖,每块砖用0表示未打扫,1表示已打扫。GX有一个奇怪的习惯,他喜欢每次只打扫一整列地砖,每当他打扫完一整列之后,这间房间会出现一个神秘的现象,未打扫的地砖会变为已打扫,已打扫的地砖会变为未打扫(也就是1会变成0,而0会变成1)。按照GX的打扫方法,请输出最多能产生多少行全都是已打扫的地砖。
输入
第一行输入n(2<= n <= 100)
接下来输入一个n*n的矩阵
输出
对于每组数据,输出一个数,表示最多能产生多少行全都是已打扫的地砖
样例输入
样例输出
杰神说20行的代码,用map果然。
#include<iostream> #include<cstdio> #include<string> #include<map> using namespace std; int main() { int n; while(~scanf("%d",&n)) { int mun=0; map<string,int>donser; for(int i=1;i<=n;i++) { char sb[105]; scanf("%s",sb); mun=max(mun,++donser[sb]); } cout<<mun<<endl; } return 0; }
问题 C: 扑鼠
题目描述
GX养的一只仓鼠最近跑进了一个神秘的城堡里,他准备在这个有n个房间的城堡中抓捕他的仓鼠,他在房间0放了一块食物,根据抓鼠攻略,这块食物可以吸引距离它D的仓鼠,但是仓鼠还是没有出现,现在给你一张这个城堡的地图,上面标有各个房间的关系,已知每个房间都相连且距离为1,GX想知道他的仓鼠可能出现在哪些房间,请输出这些房间的总数
输入
第一行输入n(0<n<=100000)和D(0<D<n)
接下来的n-1行为房间的连接关系,每行有两个数x,y代表房间x与房间y相邻
输出
对于每组数据,输出一个数,表示仓鼠可能出现的房间的数量
样例输入
样例输出
其实就是HDU4707 ,DFS
#include<set> #include<cstdio> #include<vector> #include<cstring> #include<iostream> using namespace std; set<int>donser; vector<int>d[100010]; int r=0,num=0,lable=0,deep=0; void dfs(int i) { if(deep>=r||d[i].empty()){donser.insert(i);return;} while(d[i].size()>0) { deep++; donser.insert(i); lable=d[i].back(); d[i].pop_back(); dfs(lable); deep--; } } int main() { int n,b,x,y; while(~scanf("%d%d",&n,&r)) { for(b=1;b<n;b++) { scanf("%d%d",&x,&y); d[x].push_back(y); } dfs(0); cout<<n-donser.size()<<endl; r=num=lable=deep=0; donser.clear(); memset(d,0,sizeof(d)); } return 0; }
问题 D: 电梯
题目描述
实验楼有一部神秘的电梯,它只有“上”和“下”两个按钮,实验楼的每一层都标有一个值K,第i层的值为Ki,如果按了“上”按钮,会从第i层升到第i+Ki层;如果按了“下”按钮则会从第i层降到第i-Ki层,已知能到的层数为1到N层,GX想从第A层上到第B层,现在给你N,A,B和一串数K1到Kn,请求出GX从A到B,至少按下多少个按钮。
输入
第一行输入N,A,B( 1 <= N,A,B <= 300) ,表示实验楼共有N层,起点为A,终点为B
第二行输入N个数,表示K1到Kn
输出
对于每组数据,输出一个数,表示GX从A到B,至少按下多少个按钮,如果GX无法到达B,请输出-1.
样例输入
样例输出
BFS最短路问题,以前没好好撸过BFS也算是涨姿势了。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int d[310],n,lable=0; bool str[310]; struct floor { int a; int b; }; void bfs(int x,int y) { floor temp; temp.a=x; temp.b=0; queue<floor>donser; donser.push(temp); lable=0; while(!donser.empty()) { floor temp_c; temp_c=donser.front(); donser.pop(); floor teemp1=temp_c; floor teemp2=temp_c; if(temp_c.a==y){lable=1;cout<<temp_c.b<<endl;break;} if(temp_c.a+d[temp_c.a]<=n&&!str[temp_c.a+d[temp_c.a]]) { teemp1.a=temp_c.a+d[temp_c.a]; teemp1.b++; donser.push(teemp1); str[teemp1.a]=true; } if(temp_c.a-d[temp_c.a]>=1&&!str[temp_c.a-d[temp_c.a]]) { teemp2.a=temp_c.a-d[temp_c.a]; teemp2.b++; donser.push(teemp2); str[teemp2.a]=true; } } if(!lable) cout<<"-1"<<endl; } int main() { int a,b,i; while(~scanf("%d%d%d",&n,&a,&b)) { for(i=1;i<=n;i++) { scanf("%d",&d[i]); } bfs(a,b); memset(str,0,sizeof(str)); } return 0; }
问题 E: 1D Maze
题目描述
输入
输出
样例输入
样例输出
#include<iostream> #include<cstdio> #include<string> using namespace std; int main() { char d[100]; string sb; while(~scanf("%s",d)) { int i=0,sum=0,donser=1; while(d[i]!='