T1
思路:这道题比较简单,直接循环查找即可(点(a,b)至点(a1,b1)的距离为(abs(a-a1)+abs(b-b1)),好多人直接dfs???)
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=100+10,INF=2147483647;
int n,m,x,y,a[maxn][maxn],st,minx,miny,dis=INF;
int main(){
freopen("friend.in","r",stdin);
freopen("friend.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&x,&y);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(a[i][j]==a[x][y]){//判断是否为懒羊羊的好朋友
if(i==x&&j==y)//如果就是懒羊羊,取消
continue;
if(x==i){//如果位于同一行,则距离为纵坐标之差的绝对值
if(dis>abs(y-j)){//尝试更新(小剪枝)
dis=abs(y-j);
minx=i;
miny=j;
}
}
else{
if(dis>abs(x-i)+abs(y-j)){//否则,算出它们的距离,跟当前最小比较
dis=abs(x-i)+abs(y-j);
minx=i;
miny=j;
}
}
}
}
printf("%d %d",minx,miny);
return 0;
}
思路:先将0-7的阶乘算出来,发现再向上的阶乘就超过题目限定的1000000了,所以我们就可以运用贪心的思路
代码:
#include <bits/stdc++.h>
using namespace std;
int num[10]={1,1,2,6,24,120,720,5040,40320,362880},n;
int main(){
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
while(1){
scanf("%d",&n);
if(n<0)
return 0;
if(n>409114||n==0){
printf("NO\n");
continue;
}
for(int i=9;i>=0;i--)//贪心
if(num[i]<=n&&n>0)
n-=num[i];
if(n==0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
T3
思路:这道题就是一个纯模拟题,但是我却卡了一个多小时。因为我用的是scanf读入,空格和回车都要用一个getchar,不过改成cin就没问题了。
改进:以后经量用cin,少用scanf
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=200+5,INF=2147483647;
int n,m;
struct hot{
int id,a;
string name;
int people,number,value,allpeople;
char side;
}hotel[maxn];
struct tel{
char kind;
int people,perseveryroom;
}vistor[maxn];
int main(){
freopen("hotel.in","r",stdin);
freopen("hotel.out","w",stdout);
int bed=-INF,pc=INF;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
hotel[i].id=i;
cin>>hotel[i].a;
int a=hotel[i].a;
if(20<=a&&a<=35)
hotel[i].side='A';
if(36<=a&&a<=48)
hotel[i].side='B';
if(49<=a&&a<=62)
hotel[i].side='C';
cin>>hotel[i].people>>hotel[i].number>>hotel[i].value;
cin>>hotel[i].name;
//hotel[i].allpeople=hotel[i].people*hotel[i].number;
getchar();
}
for(int i=1;i<=m;i++){
int num;
cin>>vistor[i].kind>>vistor[i].people>>vistor[i].perseveryroom;
int minn=INF,pd=28;
for(int j=1;j<=n;j++){
//if(hotel[j].allpeople<vistor[i].people)
// continue;
if(hotel[j].side!=vistor[i].kind)
continue;
int k,szsh;
szsh=min(vistor[i].perseveryroom,hotel[j].people);
if(szsh*hotel[j].number<vistor[i].people){
continue;
}
if(vistor[i].people%szsh==0)
k=vistor[i].people/szsh;
else
k=vistor[i].people/szsh+1;
int money=k*hotel[j].value;
if(money<minn){
minn=money;
pd=233;
num=hotel[j].id;
bed=hotel[j].a;
}
else if(money==minn){
minn=money;
pd=233;
if(hotel[j].a>bed){
num=hotel[j].id;
bed=hotel[j].a;
}
else if(hotel[j].a==bed){
if(num>hotel[j].id){
num=hotel[j].id;
bed=hotel[j].a;
}
}
}
}
if(pd==28)
cout<<"no-hotel"<<endl;
else{
cout<<minn<<" "<<hotel[num].name<<endl;
}
getchar();
}
return 0;
}