Yazılımda problemlerde ne yapacagim aklıma gelmiyor

tk.ydn

Picopat
Katılım
23 Temmuz 2023
Mesajlar
210
Daha fazla  
Cinsiyet
Erkek
Codeforces'te falan en kolay (800 rating) olanları çözmeye çalışıyorum amane yapacağım aklıma gelmiyor veya videolardaki soruları çözerken de aklıma gelmiyor daha sonra çözümüne bakınca veya adam çözünce ne kadar kolaymış diyorum ne yapmam lazım?
 
Codeforces'te falan en kolay (800 rating) olanları çözmeye çalışıyorum amane yapacağım aklıma gelmiyor veya videolardaki soruları çözerken de aklıma gelmiyor daha sonra çözümüne bakınca veya adam çözünce ne kadar kolaymış diyorum ne yapmam lazım?
Bunun sebebi tecrübesizlik. Algoritmayı iyice öğrenmen gerekli. Zaten genel olarak competitive programming içerisinde 150 satırı geçen pek kod olmuyor. Kod zaten zor değil sadece koda uygun hesabı ve algoritmayı bulmak zor olabilir. Yani greedy anlamayan birinin graph çalışması imkansız gibi birşey. İlk önce eolymp gibi kolay sitelere bak. Codeforces yeni başlayan biri için zorlayıcı olabilir. Algoritma öğrenmek için cses book yazarak internette bulabilirsin çok iyi bir kitap kendisi. Onun dışında da cp algorithms sitesi de competitive programming için işe yarar. Yani örnek vereyim
C++:
#include<bits/stdc++.h>
using namespace std;
vector<int> r[405], rl[405];
int n, m, u, v, rd[405], rld[405];
void dfs(vector<int> a[], int d[], int node, int dist) {
    d[node] = dist;
    for(auto i: a[node]) {
        if(d[i] == -1 || d[i] > dist + 1) {
            dfs(a, d, i, dist + 1);
        }
    }
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m;
    for(int i=1; i<=n; i++) {
        for(int j=i+1; j<=n; j++) {
            r[i].push_back(j);
            r[j].push_back(i);
        }
        rd[i] = rld[i] = -1;
    }
    for(int i=0; i<m; i++) {
        cin >> u >> v;
        r[u].erase(remove(r[u].begin(), r[u].end(), v), r[u].end());
        r[v].erase(remove(r[v].begin(), r[v].end(), u), r[v].end());
        rl[u].push_back(v);
        rl[v].push_back(u);
    }
    dfs(r, rd, 1, 0);
    dfs(rl, rld, 1, 0);
    if(rd[n] == -1 || rld[n] == -1) {
        cout << -1;
    } else {
        cout << max(rd[n], rld[n]);
    }
    return 0;
}
şu koda bakınca ne kadar zor bir kod gibi dursa da algoritmayı bilince kod yazmak aşırı zor olmuyor. Önemli olan algoritmayı iyice kavramak ve o dili bilmek.

Codeforces'te falan en kolay (800 rating) olanları çözmeye çalışıyorum amane yapacağım aklıma gelmiyor veya videolardaki soruları çözerken de aklıma gelmiyor daha sonra çözümüne bakınca veya adam çözünce ne kadar kolaymış diyorum ne yapmam lazım?
C++:
#include<bits/stdc++.h>
using namespace std;
int main() {
    int w;
    cin >> w;
    if (w > 2 && w % 2 == 0) {
        cout << "YES";
    } else {
        cout << "NO";
    }
    return 0;
}
Problem - 4A - Codeforces bu sorunun cevabı bu. Gel sana bu kodu yavaş yavaş anlatayım anlaman için. Problemlerin genel olarak input-output kısmına dikkatle bak. Çoğu zaman böyle problemlerin başında saçma sapan gereksiz şeyler veriliyor. Soruya bakalım bizden karpuzun ağırlığını istiyor. Tamam karpuzun ağırlığı 8 olsun. Output'ta ise karpuzu böldüğümüzde çift sayı oluyor mu ? Not kısmında da dediği gibi 2,6 ve ya 4,4 şeklinde yazabilirsin. Ancak 3,5 şeklinde yazamazsın çünki çift sayı istiyor. Şimdi program koda bakacak 2'den büyük yazma sebebimiz ise zaten ilk çift sayının 2 olması. Karpuz eğer 2 kilo ise direkt olarak "NO" yazdıracak. Neyse sonra bakıyoruz karpuz eğer 2 kilodan ağırsa ve karpuzu x%2 şeklinde yazabiliyorsak bunu kesir olarak düşünebilirsin. Yani 5 kiloyu 2'ye böldüğümüzde tam sayı alamıyoruz bu yüzden "NO" olacak ama oraya 8 yazarsak hem 2'den büyük hemde 8%2=0 çünki 8/2=4 ve bu da bir tamsayı olacak. Umarım anlamışsındır. @tk.ydn
 
Son düzenleme:

Yeni konular

Geri
Yukarı