目录
ly的小迷弟
题目描述
众所周知ly虽然是个小胖子,但是长得还是很好看的,所以她有很多小迷弟(bu cun zai de),但是ly当然不是个只看颜值的人了,所以在她觉得颜值还可以的所有人里,把这些人选出来按照智商排序...
虽然wjw不是ly的小迷弟,但是wjw很想知道某个智商值在这群人里能排多少名,那么只能麻烦你帮他了输入
第一行一个整数N表示有N个被选出来的小迷弟
第二行N个整数分别表示这N个小迷弟的智商
接下来若干行表示wjw的询问,每行一个智商值输出
每行一个整数表示答案
样例输入 Copy
5 1 2 3 4 5 1 2 3 4 5
样例输出 Copy
1 2 3 4 5
提示
0<=智商<=2^31-1
0<=N<=1000000大量的输入输出,建议使用scanf,printf代替cin,cout,使用BufferReader代替Scanner
#include<bits/stdc++.h>
using namespace std;
int a[1000010];
int main()
{
int n,i,m;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
while(~scanf("%d",&m))
{
int l=0,r=n-1,mid;
while(l<=r)
{
mid=(l+r)/2;
if(a[mid]>=m)
{
r=mid-1;
}
else l=mid+1;
}
printf("%d\n",l+1);
}
return 0;
}
wjw的星期五
题目描述
wjw最近运气极其差,什么roll点1-100连着十次都是个位数啊,买个珍珠奶茶没有珍珠啊,吃方便面没有调料包啊...
迷信的wjw觉得,一定是因为这个月的13号正好是星期五,才会导致他的运气这么差。
现在他想知道,在某个年份中,有多少个月的13号是星期五,这样他才可以提前做好心理准备。
PS.已知1998年1月1日是星期四,输入的年份肯定大于或等于1998年。输入
input
输入只有一行,表示年份(大于等于1998年)输出
output
输出只有一行,表示这一年中有多少个月的13号是星期五样例输入 Copy
1998
样例输出 Copy
3
提示
说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;
#include<bits/stdc++.h>
using namespace std;
int m[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int aa(int n){
int day;
if(n%4==0&&n%100!=0||n%400==0){
m[1]=29;
day=366;
}else{
m[1]=28;
day=365;
}
return day;
}
int main()
{
int n;
int i;
while(~scanf("%d",&n)){
int ans=0;
long long d=0;
for(i=1998;i<n;++i){
d+=aa(i);
}
aa(n);
for(i=0;i<12;++i){
if((d+13)%7==2){
ans++;
// printf("%d\n",ans);
}
d+=m[i];
}
printf("%d\n",ans);
}
return 0;
}
汽车加油问题
题目描述
一辆汽车加满油后可以行驶n千米。旅途中有k个加油站。若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。
输入
第一行有2个正整数n和k,表示汽车加满油后可行驶nkm,且旅途中有k个加油站。接下来1行中,有k+1个整数,表示第k个加油站与第k-1个加油站之间的距离。第0个加油站表示出发地,汽车已加满油,且在第0个加油站满油不算加油,第k+1个加油站表示目的地。(请处理到文件尾)
输出
最少加油次数。如果无法到达目的地,则输出“No Solution”。
样例输入 Copy
7 7 1 2 3 4 5 1 6 6
样例输出 Copy
4
#include<bits/stdc++.h>
using namespace std;
int a[100005];
void aa(int n,int k){
int ans=0;
int s=0;
for(int i=0;i<=k;++i){
if(a[i]>n){
cout<<"No Solution"<<endl;
return;
}
s+=a[i];
if(s>n){
ans++;
s=a[i];
}
}
cout<<ans<<endl;
}
int main()
{
int n,k;
while(cin>>n>>k){
for(int i=0;i<=k;++i)
cin>>a[i];
aa(n,k);
}
return 0;
}
ABC + DEF = GHI
题目描述
用1, 2, 3...9 这九个数字组成一个数学公式,满足:ABC + DEF = GHI,每个数字只能出现一次,编写程序输出所有的组合。
输入
无
输出
输出所有的 ABC + DEF = GHI,
每行一条数据,格式为ABC+DEF=GHI
输出结果按照ABC升序排列,如果ABC相同,则按照DEF升序排列。
#include<bits/stdc++.h>
using namespace std;
int a[15]={0};
int b[15]={0};
void dfs(int n){
int i;
if(n==10){
int x,y,z;
x=a[1]*100+a[2]*10+a[3];
y=a[4]*100+a[5]*10+a[6];
z=a[7]*100+a[8]*10+a[9];
if(x+y==z){
printf("%d+%d=%d\n",x,y,z);
}
return ;
}
for(i=1;i<10;++i){
if(b[i]==0){
a[n]=i;
b[i]=1;
dfs(n+1);
b[i]=0;
}
}
}
int main(){
dfs(1);
return 0;
}
油田问题
题目描述
输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),即属于同一个八连块。
输入
输入行数m,已经列数n。
然后输入*和@输出
联通块个数
样例输入 Copy
5 5 ****@ *@@*@ *@**@ @@@*@ @@**@
样例输出 Copy
2
#include<iostream>
#include<cstring>
#include<cmath>
#include<ctype.h>
#include<algorithm>
using namespace std;
int m,n;
const int maxn = 1005;
char a[maxn][maxn];
int vis[maxn][maxn];
void dfs(int x, int y, int ans) {
if (x<0||x>=m||y<0||y>=n)
return;
if (vis[x][y]>0||a[x][y]!='@')
return;
vis[x][y]=ans;
for(int i=-1;i<=1;i++)
for(int j=-1;j<=1;j++)
if (i||j)
dfs(x+i,y+j,ans);
}
int main(){
while (cin>>m>>n){
for(int i=0;i<m;i++)
cin>>a[i];
memset(vis,0,sizeof(vis));
int ans=0;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
if(vis[i][j]==0&&a[i][j]=='@'){
++ans;
dfs(i,j,ans);
}
cout<<ans<<endl;
}
return 0;
}
马的遍历问题
题目描述
在5*4的棋盘中,马只能走斜“日”字。马从位置(x, y)处出发,把棋盘的每一格都走一次,且只走一次,请找出所有路径。
输入
x,y,表示马的初始位置。
输出
将每一格都走一次的路径总数,如果不存在该路径则输出“No solution!”。
样例输入 Copy
1 1 2 2
样例输出 Copy
32 No solution!
#include<iostream>
#include<cstring>
#include<cmath>
#include<ctype.h>
#include<algorithm>
using namespace std;
int m=5,n=4;
int fx[8]={1,2,2,1,-1,-2,-2,-1};
int fy[8]={2,1,-1,-2,-2,-1,1,2};
int a[10][10];
int ans;
int check(int x,int y){
if(x>=0&&x<m&&y>=0&&y<n&&a[x][y]==0)
return 1;
else
return 0;
}
void dfs(int x, int y, int d) {
int dx,dy,i;
if(d==m*n){
++ans;
return;
}
for(i=0;i<8;++i){
dx=x+fx[i];
dy=y+fy[i];
//cout<<dx<<' '<<dy<<endl;
if(check(dx,dy)){
a[dx][dy]=d;
dfs(dx,dy,d+1);
a[dx][dy]=0;
}
}
}
int main(){
int a1,a2;
while(cin>>a1>>a2){
ans=0;
memset(a,0,sizeof(a));
--a1;
--a2;
a[a1][a2]=1;
dfs(a1,a2,1);
if(ans==0){
cout<<"No solution!"<<endl;
}else{
cout<<ans<<endl;
}
}
return 0;
}