Wannafly交流賽1
阿新 • • 發佈:2019-01-29
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
這裡鄭重給出時間複雜度
#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;
}