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;
}