A.有理数
复习一下C/C++的整除,C++的整除是向零取整,这样的好处有blablabla。。
所以分类讨论一下就好了
#include <bits/stdc++.h>
using namespace std;
int main(){
int t,p,q;
cin>>t;
while(t--){
cin>>p>>q;
if (p%q==0){
cout<<p/q-1<<endl;
continue;
}
if (p>0){
if (q>0) cout<<p/q<<endl;
else cout<<p/q-1<<endl;
}
else {
if (q>0) cout<<p/q-1<<endl;
else cout<<p/q<<endl;
}
}
return 0;
}
B.硬币
这题应该算作贪心,不过贪了好久才贪出来,还是太菜了。
自己感受出一个性质,50元可以等价为10张5元,10元可以等价为2张5元,所以只用考虑全部都是5元就好了,这样就不用写100多行的贪心模拟了。。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll t,a,b,c,d,v,times,num;
cin>>t;
while(t--){
cin>>a>>b>>c>>d>>v;
b+=c*2+d*10;
if (v%5==0){
cout<<a<<endl;
continue;
}
num=v/5+1;;
times=b/num;
a+=times*(num*5-v);
cout<<a<<endl;
}
return 0;
}
D.迷宫2
这题,应该可以出的,算法完全正确,但是给卡常了,然后自己又不是很肯定时间复杂度,以为是算法错了,导致。。
Bfs+Dijkstra,这题等价于找一条从左下角到右上角的路并要求权值最小,不能动态规划,只能用Dijkstra
这里郑重给出时间复杂度
O(qnmlog(nm))
O
(
q
n
m
l
o
g
(
n
m
)
)
#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,a,b) for(int i=(a);i<=(b);i++)
#define DOWN(i,a,b) for(int i=(a);i>=(b);i--)
#define CLR(a) memset(a,0,sizeof(a));
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const ll LL_INF=0x3f3f3f3f3f3f3f3f;
const int N=500+10;
int q,n,m;
int vis[N][N];
int dx[4]={0,0,-1,1},
dy[4]={-1,1,0,0};
ll ans;
struct state{
int x,y;
ll dist;
bool operator< (const state& rhs) const{
return dist>rhs.dist;
}
};
int main(){
scanf("%d%d%d",&q,&n,&m);
while(q--){
ll d[N][N],a[N][N];
priority_queue<state> Q;
REP(i,1,n) REP(j,1,m) {
scanf("%lld",&a[i][j]);
if (a[i][j]==-1) a[i][j]=0;
else if (a[i][j]==0) a[i][j]=-1;
d[i][j]=LL_INF;
}
REP(i,1,n) {
if (a[i][1]==-1) continue;
Q.push((state){i,1,a[i][1]});
d[i][1]=a[i][1];
}
REP(i,1,m){
if (a[n][i]==-1) continue;
Q.push((state){n,i,a[n][i]});
d[n][i]=a[n][i];
}
// REP(i,1,n){
// REP(j,1,m) cout<<a[i][j]<<' ';
// cout<<endl;
// }
// REP(i,1,n){
// REP(j,1,m) cout<<d[i][j]<<' ';
// cout<<endl;
// }
ans=-1;
while(!Q.empty()){
state t=Q.top();Q.pop();
// cout<<t.x<<' '<<t.y<<' '<<t.dist<<endl;
if (t.x==1||t.y==m) {
ans=t.dist;
break;
}
FOR(i,0,4){
int x=t.x+dx[i];
int y=t.y+dy[i];
ll D=d[t.x][t.y]+a[x][y];
if (a[x][y]==-1) continue;
if (x<1||x>n||y<1||y>m) continue;
if (D>=d[x][y]) continue;//注意,>就会TLE,>=就可以。。
d[x][y]=D;
Q.push((state){x,y,D});
}
}
/*REP(i,1,n){
REP(j,1,m) cout<<d[i][j]<<' ';
cout<<endl;
}*/
printf("%lld\n",ans);
}
return 0;
}