1. 程式人生 > >Wannafly交流賽1

Wannafly交流賽1

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