题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。 同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵 向的通道。 于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。 请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。
输入输出格式 输入格式 输入文件chair.in 第一行,有5个用空格隔开的整数,分别是M,N,K,L,D(2<=N,M<=1000,0<=K<M,0<=L<N,D<=2000)。 接下来的D行,每行有4个用空格隔开的整数。第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。 输入数据保证最优方案的唯一性。 输出格式 输出文件chair.out 共两行。 第一行包含K个整数,a1,a2……aK,表示第a1行和a1+1行之间、第a2行和a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。 第二行包含L个整数,b1,b2……bL,表示第b1列和b1+1列之间、第b2列和b2+1列之间、…、第bL列和第bL+1列之间要开辟通道,其中bi< bi+1,每两个整数之间用空格隔开(列尾没有空格)。
输入输出样例 输入样例#1: 4 5 1 2 3 4 2 4 3 2 3 3 3 2 5 2 4 输出样例#1: 2 2 4 输入样例#2: 无 输出样例#2: 无 输入样例#3: 无 输出样例#3: 无
#include<bits/stdc++.h> #define N 1003 using namespace std; int m,n,k,l,d,x[N],y[N],c[N],o[N],res[N],len=1; int main(){ scanf("%d%d%d%d%d",&m,&n,&k,&l,&d); for(int i=1;i<=d;i++){ int xi,yi,pi,qi; scanf("%d%d%d%d",&xi,&yi,&pi,&qi); if(xi==pi)x[min(yi,qi)]++; else y[min(xi,pi)]++; } for(int i=1;i<=k;i++){ int maxn=-1,p; for(int j=1;j<m;j++) if(y[j]>maxn){maxn=y[j];p=j;} y[p]=0;c[p]++; } for(int i=1;i<=l;i++){ int maxn=-1,p; for(int j=1;j<n;j++) if(x[j]>maxn){maxn=x[j];p=j;} x[p]=0;o[p]++; } for(int i=0;i<N;i++)if(c[i]&&i!=0)res[++len]=i; for(int i=1;i<len;i++)if(res[i]!=0)printf("%d ",res[i]); printf("%d\n",res[len]); for(int i=1;i<=len;i++)res[i]=0;len=1; for(int i=0;i<N;i++)if(o[i]&&i!=0)res[++len]=i; for(int i=1;i<len;i++)if(res[i]!=0)printf("%d ",res[i]); printf("%d\n",res[len]); return 0; }
Hanoi双塔问题(同182)
排列生成
题目描述 输入n,1<=n<=8。输出n的全排列,每一行一个排列方案,数字由空格隔开,按照字典序输出。注意行末不能有空格。
输入输出格式 输入格式 如题 输出格式 如题 输入输出样例 输入样例#1: 2 输出样例#1: 1 2 2 1 输入样例#2: 3 输出样例#2: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 输入样例#3: 无 输出样例#3: 无
#include<bits/stdc++.h> using namespace std; int n,x[9]; void print(){ for(int i=0;i<n-1;i++)cout<<x[i]<<" "; cout<<x[n-1]<<endl; } int main(){ cin>>n; for(int i=0;i<n;i++)x[i]=i+1; do{ print(); }while(next_permutation(x,x+n)); return 0; }
题目描述 王村长生了个大胖儿子需要起英文名字,关键要朗朗上口。他认为有n种音节是好听的,必须都用到一次,那么有哪些排序方式呢?
输入输出格式 输入格式 输入文件名name1.in 输入第一行为正整数n,第二行有n个小写字符串各自代表一种音节(无重复),n<=5。 输出格式 输出文件名name1.out 输出儿子的小写英文名候选方案,每一行输出一个,按照字典序输出。注意儿子一定姓王。注意行末没有空格。
输入输出样例 输入样例#1: 2 tuo ni 输出样例#1: nituo wang tuoni wang 输入样例#2: 3 cha li si 输出样例#2: chalisi wang chasili wang lichasi wang lisicha wang sichali wang silicha wang 输入样例#3: 无 输出样例#3: 无
#include<bits/stdc++.h> using namespace std; int n; string s[6]; void print(){ for(int i=0;i<n;i++)cout<<s[i]; cout<<" wang"<<endl; } int main(){ freopen("name1.in", "r", stdin); freopen("name1.out", "w", stdout); cin>>n; for(int i=0;i<n;i++)cin>>s[i]; sort(s, s+n); do{ print(); }while(next_permutation(s,s+n)); return 0; }
题目描述 在一个n*m格子的迷宫里,o代表空地可以行走,#代表墙体不可以通过,R代表罗密欧,J代表朱丽叶。罗密欧和朱丽叶每秒钟可以上下左右四个方 向走动一格,请问他们相遇需要至少几秒钟?如果无法相遇输出forever 。 输入输出格式 输入格式 输入文件romeo.in 输入第一行为n和m,n,m<=10。接着是n*m格的字符。 输出格式 输出文件romeo.out 输出forever或者一个浮点数,保留一位小数
输入输出样例 输入样例#1: 2 2 oJ R# 输出样例#1: 1.0 输入样例#2: 4 5 ooo#J o#o#o o#o#o R#ooo 输出样例#2: 6.5 输入样例#3: 2 2 R# #J 输出样例#3: forever
#include<bits/stdc++.h> #define N 19 using namespace std; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; int m,n,xR,yR,xJ,yJ,dst[N][N]; char d[N][N]; bool vst[N][N]; struct Node{ int x,y; }; int bfs(){ queue<Node> q; vst[xR][yR]=1; dst[xR][yR]=0; q.push((Node){xR,yR}); while(!q.empty()){ Node now=q.front(); q.pop(); for(int k=0;k<4;k++){ int nx=now.x+dx[k],ny=now.y+dy[k]; if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&d[nx][ny]!='#'&&!vst[nx][ny]){ vst[nx][ny]=1; dst[nx][ny]=dst[now.x][now.y]+1; q.push((Node){nx,ny}); if(nx==xJ&&ny==yJ)return dst[nx][ny]; } } } return -1; } int main(){ freopen("romeo.in", "r", stdin); freopen("romeo.out", "w", stdout); cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ cin>>d[i][j]; if(d[i][j]=='R')xR=i,yR=j; if(d[i][j]=='J')xJ=i,yJ=j; } int res=bfs(); if(res==-1)cout<<"forever"; else cout<<fixed<<setprecision(1)<<res/2.0; return 0; }
题目描述 1.以下哪个是灰太狼的老婆 A.红太狼 B.红太阳 C.红彤彤 D.红金宝 2.以下哪个是中国古代四大美女之一 A.杨玉环 B.杨紫 C.杨颖 D.杨幂 3.在四大天王里任选两个(不计顺序),共有几种选法? 注意:这不是编程题,只是披着编程题外衣的选择/填空题。你只需要提交如下代码,并在(*)行处填入你的答案即可 #include<iostream> #include<string> using namespace std; string ans[3]={"A","C","1"}; // (*) int i; int main() { cin>>i; cout<<ans[i-1]<<endl; return 0; }
输入输出格式 输入格式 无 输出格式 无
输入输出样例 输入样例#1: 无 输出样例#1: 无 输入样例#2: 输出样例#2: 输入样例#3: 输出样例#3:
#include<iostream> #include<string> using namespace std; string ans[3]={"A","A","6"}; int i; int main() { cin>>i; cout<<ans[i-1]<<endl; return 0; }
题目描述 中位数也就是中间位置的数。 有一个数组共n个元素(n为奇数),其中某个数x称为中位数,x满足如下条件: 可以将数组内除了x以外的其他n-1个数分为个数相等的 两组数字A,B。A中的数值都不大于x,B中的值都不小于x。
输入输出格式 输入格式 输入文件median.in 输入第1行是一个正奇数n。第2行n个正整数。 数据规模: 对于30%的数据,1<=n<=100 对于70%的数据,1<=n<=10000 对于100%的数据,1<=n<=100000,数组元素均不超过1000 输出格式 输出文件median.out 输出一个整数,表示中位数的值。
输入输出样例 输入样例#1: 5 1 2 3 4 5 输出样例#1: 3 输入样例#2: 5 1 2 2 4 5 输出样例#2: 2 输入样例#3: 输出样例#3:
#include<bits/stdc++.h> using namespace std; int main(){ freopen("median.in", "r", stdin); freopen("median.out", "w", stdout); int n,a[100001]; cin>>n; for(int i = 0; i < n; i ++) cin>>a[i]; sort(a, a+n); cout<<a[(n+1)/2-1]; return 0; }
题目描述 有n根面条。每根面条可以切割开成为若干正整数长度小面条,但不能拼 接。现在要从这些面条中切割出m条长度相同的小面条,求每段小面条的 最大长度是多少。允许有剩余
输入输出格式 输入格式 输入:第一行是正整数n和m,n<=10^5,m<=10^8。第二行是n 个不超过10^6 的正整数,表示每条的长度。 输出格式 输出:切出小面条的最大长度,若无法切割,输出Failed。
输入输出样例 输入样例#1: 3 4 10 5 9 输出样例#1: 5 输入样例#2: 4 5 5 6 7 8 输出样例#2: 4 输入样例#3: 无 输出样例#3: 无
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m,x[1000008]; bool OK(ll len){ ll cnt=0; for(ll i=0;i<n;i++){ cnt+=x[i]/len; if(cnt>=m)return 1; } return 0; } int main(){ cin>>n>>m; for(int i=0;i<n;i++)cin>>x[i]; ll l=1; ll r=*max_element(x,x+n); ll ans=0; while(l<=r){ ll mid=l+(r-l)/2; if(OK(mid))ans=mid,l=mid+1; else r=mid-1; } if(ans>0)cout<<ans; else cout<<"Failed"; return 0; }
题目描述 牛郎是地上的农民,织女是天上的神仙,他们相爱却不能在一起,被迫分离。传说在农历七月初七,喜鹊会在他们之间架起一座鹊桥,而他们每年也只能在鹊桥上相聚一次。因为喜鹊们体力有限,只能支撑桥面100秒,100秒后鹊桥就会坍塌。鹊桥长度为L米,牛郎的奔跑速 度为每秒u米,织女的速度为每秒v米。牛郎和织女同时从桥两头开始奔跑,最终要在桥坍塌前安全回到各自起点,那么他们最多能拥抱在一起几秒?
输入输出格式 输入格式 输入文件bridge.in 输入第一行为正整数L,u,v,均不超过1000。 输出格式 输出文件bridge.out 输出一个浮点数,保留2位小数。
输入输出样例 输入样例#1: 1000 400 100 输出样例#1: 96.00 输入样例#2: 50 4 4 输出样例#2: 87.50 输入样例#3: 输出样例#3:
#include<bits/stdc++.h> using namespace std; int main(){ freopen("bridge.in", "r", stdin); freopen("bridge.out", "w", stdout); double L, u, v; double result; cin>>L>>u>>v; result = max(100 - L / (u + v) * 2, 0.0); cout<<fixed<<setprecision(2)<<result<<endl; return 0; }
题目描述 因为数学老师总是以各种理由霸占体育课的时间来上数学课,体育老师心中积怨已久。有一天体育老师把数学老师关在“体育乐园”里,这里对体育老师来说是个乐园,有篮球足球乒乓球,但对于身体柔弱的数学老师来说简直就是监牢。乐园大门的锁需要密码才能打开,真正密码藏在一串字符串S里。作为数学课代表,你要解救数学老师。有一个道理大家都明白,体育老师因为忌恨数学所以不会用数字作为密 码,S里去除所有数字后就是真正的密码。给定S,请你求出真正的秘密。
输入输出格式 输入格式 输入文件paradise.in 输入一行包含一串字符串,长度不超过1000。 输出格式 输出文件paradise.out 输出一串字符串,代表真正密码
输入输出样例 输入样例#1: 123soc456cer7890 输出样例#1: soccer 输入样例#2: si33zhi44fa55da 输出样例#2: sizhifada 输入样例#3: 输出样例#3:
#include<bits/stdc++.h> using namespace std; int main(){ freopen("paradise.in", "r", stdin); freopen("paradise.out", "w", stdout); string s; getline(cin, s); for(int i = 0; i < s.size(); i++){ if(!(s[i] <= '9' && s[i] >= '0')) cout<<s[i]; } return 0; }
题目描述 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张。可以在任一堆上取若干张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。输出最少的移动次数,若无解输出-1。
输入输出格式 输入格式 输入文件名cards.in 输入第一行为正整数N(N 堆纸牌,1 <= N <= 100),第二行为N个正整数A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000) 输出格式 输出文件名cards.out 输出一个整数。
输入输出样例 输入样例#1: 4 9 8 17 6 输出样例#1: 3 输入样例#2: 3 6 6 6 输出样例#2: 0 输入样例#3: 无 输出样例#3: 无
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,card[105],ave,step; int main() { freopen("cards.in", "r", stdin); freopen("cards.out", "w", stdout); scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&card[i]),ave+=card[i]; ave=ave/n; for(int i=1;i<=n;++i) { if(ave==card[i]) continue; card[i+1]+=card[i]-ave,step++; } printf("%d\n",step); return 0; }