UPC——2020年春混合個人訓練第二十四場(DEFG)

D.壞掉的手錶

時間限制: 1 Sec 內存限制: 128 MB
[提交] [狀態]
題目描述
有個手錶壞了,時間爲HH:MM,你要把這個不合法的時間變爲合法,請求出最少要動幾位
輸入
第一行表示手錶時間是什麼制式
第二行HH:MM表示手錶當前時間
輸出
一個整數表示答案
樣例輸入 Copy
12
17:30
樣例輸出 Copy
1

題意:

給定時間制和時間,問最少變幾位使得該時間符合時間制。

思路:

模擬模擬模擬
但這個題巨坑啊。
奇奇怪怪的數據比如說:12小時制的12:50是合法的。其他就看看下面的圖就好了。

在這裏插入圖片描述
代碼:
隊友寫的直接貼過來了

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const long long inf =0x3f3f3f3f;
const int maxn=1e6+5; 
const long long mod =19260817;
#define PI 3.14159265358979323846
#define ll long long
#define ull unflaged ll
inline int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
string s;
int main()
{
    int n;
    cin>>n;//n制式
    cin>>s;
    int ans=0;
    int t1=((s[0]-'0')*10)+(s[1]-'0');
    int t2=((s[3]-'0')*10)+(s[4]-'0');
    if(n==12)
    {
        if(t1>n||t1<1) ans++;
        if(t2>=60) ans++;
    }
    else
    {
        if(t1>=n) ans++;
        if(t2>=60) ans++;
    }
 
    cout<<ans<<endl;
     
}
 

E.流星

時間限制: 1 Sec 內存限制: 128 MB
[提交] [狀態]
題目描述
我帶着深藏骨血的仇恨與醞釀多年的陰謀
把自己變成一個死而復生的幽靈沉入沼澤,沉入深淵
我想埋下腐爛的根系長出見血封喉的荊棘刺穿這個虛僞的文明
我到了淤泥深處……撿到了一顆星星。
晨光起於白塔尖頂,終將鋪滿陰霾之地。
Marser正在和副詞看星星。這時,他們發現了一顆流星劃過天際。Marser出於習慣,記錄下了這顆流星出現和消失的位置。Marser兩組座標來描述這兩個位置。你可以認爲它們被Marser放在了一個原點由Marser指定的笛卡爾座標系中。

現在,副詞爲了考驗Marser的智商,想問他一個問題:按照Marser的座標系定義,這顆流星一共經過了多少個格點?這裏,格點被定義爲座標均爲整數的點。

Marser用了1ms就完成了這個問題,於是他想用這個問題來測試您的智力。當然,爲了簡化您的操作,您可以把流星的運動軌跡看成一條直線。這樣,您可以把這個問題轉化爲求一條線段除了端點外經過了多少個格點。
輸入
讀入兩行,每行兩個整數 x,y,表示線段的兩個端點的座標。
輸出
輸出一行一個整數,表示除了兩個端點外,線段經過的格點數量。
樣例輸入 Copy
1 11
5 3
樣例輸出 Copy
3
提示
對於30%的數據,保證max(∣x∣,∣y∣)≤103;
對於60%的數據,保證max(∣x∣,∣y∣)≤106;
對於全部數據,保證max(∣x∣,∣y∣)≤1012。

題意:

求除了兩個端點外,線段經過的格點數量。

思路:

GCD的性質。以前做過加強版。
博客講解
需要注意:
1.開long long
2.當線段的兩個端點重合時需要特判

代碼:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;

ll gcd(ll a,ll b){
    return b==0?a:gcd(b,a%b);
}

void AC(){
    ll x1,y1,x2,y2;
    scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
    ll res;
    if(x1==x2&&y1==y2) res=0;
    else{
        ll xx=abs(x1-x2),yy=abs(y1-y2);
        ll GCD=gcd(xx,yy);
        res=GCD-1;
    }
    printf("%lld\n",res);
}

int main(){
    AC();
    return 0;
}

F: Hash 鍵值

時間限制: 1 Sec 內存限制: 128 MB
[提交] [狀態]
題目描述
所有的苦難與揹負盡頭,
都是行雲流水般的此世光陰。
一生所渴求的,全都傷人至深。
而一生所憎惡的,全都令人魂牽夢縈。
Marser 沉迷 hash無法自拔,然而他發現自己記不住 hash 鍵值了……

Marser 使用的 hash 函數是一個單純的取模運算,每一個數 i 被對應到 i mod p。他現在有一個數列 a1,a2,…,an,他採用這種方法,把每一個數 ai 對應到一個鍵值 i mod p。他想知道對於給定的模數 p 和鍵值 r,所有對應到該鍵值的數的和爲多少。同時,Marser 可能會發現他的數列出了一些問題,所以他還想隨時更改數列中任意一項的值。

現在 Marser 有 q 個請求,每個請求可能是修改或是詢問。對於每一個詢問,你需要給出正確的答案。如果你不能在 1s 內正確回答所有詢問,Marser 就會讓 hotwords 把你給續了。
輸入
第一行兩個整數 n,q,表示數列長度和請求數量。
第二行 n 個整數,表示初始的序列。
接下來 q 行,每行三個整數 opt,x,y;

若 opt=1,則詢問在 mod x 時,所有對應到鍵值 y 的數的和。
若 opt=2,則將數列第 x 項修改爲 y。
輸出
對於每個詢問,輸出相應的答案。
樣例輸入 Copy
10 5
1 2 3 4 5 6 7 8 9 10
1 2 1
2 1 20
1 3 1
2 5 1
1 5 0
樣例輸出 Copy
25
41
11
提示
對於 100% 的數據,保證 n,q≤105,輸出的所有數據在 int 範圍內。

思路源於:傳送門
有被驚豔到。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+100;
ll s[2100][2100];
ll a[maxn];
int n,q;

void AC(){
    scanf("%d%d",&n,&q);
    int block=sqrt(n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        for(int j=1;j<=block;j++)
            s[j][i%j]+=a[i];
    }

    while(q--){
        int op,x,y;
        scanf("%d%d%d",&op,&x,&y);
        if(op==1){
            if(x<=block) printf("%lld\n",s[x][y]);
            else{
                ll res=0;
                for(int i=y;i<=n;i+=x) res+=a[i];
                printf("%lld\n",res);
            }
        }
        else{
            ///先更新區間
            for(int i=1;i<=block;i++)
                s[i][x%i]=s[i][x%i]-a[x]+y;
        ///再更新單點
            a[x]=y;
        }
    }
}

int main(){
    AC();
    return 0;
}

G: 麥田

時間限制: 1 Sec 內存限制: 128 MB
[提交] [狀態]
題目描述
我心裏有一簇迎着烈日而生的花,
比一切美酒都要芬芳,
滾燙的馨香淹沒過稻草人的胸膛,
草扎的精神,從此萬壽無疆。
凝視深淵的人,深淵也在凝視你。
我不是凝視深淵的人,我就是深淵。
Marser 來到了一片麥田。他想穿過這片麥田,去找副詞一起學習。

但是,他發現這片麥田有一些特殊的性質。我們可以把麥田抽象成一片 n×mn \times mn×m 的網格,每個格子上都有一個數字。同時,Marser 按如下的方式表示前進的方向:

如果往與所在格子上數字相同的方向前進,Marser 不需要花費體力;而往其他方向前進時,Marser 就需要額外花費 111 單位的體力。

現在,Marser 想知道,從給定的起點前進到給定的終點,最少需要消耗多少體力?
輸入
第一行兩個整數 n,m(n,m≤1000),表示麥田的大小。
接下來 n 行,每行一個長度爲 m 的字符串,表示每個格子上的數字。
接下來一行,四個整數 xs,ys,xt,yt,表示起點和終點的位置。
輸出
輸出一行一個整數,表示最少需要消耗的體力。
樣例輸入 Copy
5 5
04125
03355
64734
72377
02062
4 2 4 2
樣例輸出 Copy
0
題意:

每個點可以向周圍8個方向走,如果走的格子的數字和當前方位代表的數字相同,花費就是0,否則花費就是1,問最小花費。

思路:

花費不是0就是1,雙端隊列BFS裸題。
博客講解
注意輸入的形式,可以用字符串類型輸入,也可以用

 scanf("%1d",&g[i][j]);

輸入,表示逐位輸入。

代碼:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
#define x first
#define y second
typedef pair<int,int>PII;

int g[1100][1100];
int n,m;
int sx,sy,ex,ey;
int res=0;

int nx[8]={-1,-1,0,1,1,1,0,-1};
int ny[8]={0,1,1,1,0,-1,-1,-1};

int dis[1100][1100];
bool st[1100][1100];

void bfs(){
    memset(dis,0x3f,sizeof dis);
    memset(st,0,sizeof st);
    dis[sx][sy]=0;
    deque<PII>q;
    q.push_back({sx,sy});
    while(q.size()){
        PII t=q.front();
        q.pop_front();
        if(t.x==ex&&t.y==ey) break;
        st[t.x][t.y]=1;
        for(int i=0;i<8;i++){
            int a=t.x+nx[i],b=t.y+ny[i];
            if(a<1||a>n||b<1||b>m) continue;
            if(dis[a][b]>dis[t.x][t.y]+(g[t.x][t.y]!=i)){
                dis[a][b]=dis[t.x][t.y]+(g[t.x][t.y]!=i);
                if(g[t.x][t.y]!=i){
                    ///權值爲1
                    ///加到隊尾
                    q.push_back({a,b});
                }
                else{
                    ///權值爲0
                    ///加到隊首
                    q.push_front({a,b});
                }
            }
        }
    }
}
int main(){
     scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%1d",&g[i][j]);
    scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
   /* for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            cout<<g[i][j];
            if(j==m) puts("");
            else cout<<" ";
        }*/
    bfs();
    printf("%d\n",dis[ex][ey]);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章