夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

わー

自分で解いたよ、多分

2436

#include <cstdio>
#include <cstring>
#define max(a,b) (a)>(b)?(a):(b)
int n, d, k;
int cow[1000][15];
bool ok[1000];
int main() {
    scanf("%d%d%d",&n,&d,&k);
    for (int i=0; i<n; i++) {
        int di; scanf("%d",&di);
        for (int j=0; j<di; j++) {
            int dis; scanf("%d",&dis);
            cow[i][dis-1]=1;
        }
    }
    int res=0;
    for (int i=0; i<(1<<d); i++) {
        if (__builtin_popcount(i)>k) continue;
        memset(ok, 0, sizeof(ok));
        for (int j=0; j<d; j++) {
            if ((i>>j)&1) continue;
            for (int k=0; k<n; k++) if (cow[k][j]) ok[k]=true;
        }
        int cnt=0;
        for (int j=0; j<n; j++) if (!ok[j]) cnt++;
        res=max(res,cnt);
    }
    printf("%d\n",res);
}

2376

#include <cstdio>
#include <algorithm>
using namespace std;
struct shift { int s, e; };
bool comp(const shift& s1, const shift& s2) {
    // if (s1.s==s2.s) return s1.e>s2.e;
    return s1.s < s2.s;
}
shift ss[25000];
int main() {
    int n, t;
    scanf("%d%d",&n,&t);
    for (int i=0; i<n; i++) {
        scanf("%d%d",&ss[i].s,&ss[i].e);
    }
    sort(ss,ss+n,comp);
    int to=0, from=1, res=0, i=0;
    bool update;
    while (true) {
        update=false;
        for (; i<n&&ss[i].s<=from; i++) {
            to=max(to, ss[i].e);
            update=true;
        }
        res++;
        if (to>=t) {
            printf("%d\n",res);
            break;
        }
        if (i==n||!update) {
            puts("-1");
            break;
        }
        from=to+1;
    }
}

2371

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int n, k;
string emp;
int data[100000];
int main() {
    scanf("%d",&n);
    for (int i=0; i<n; i++) scanf("%d",&data[i]);
    sort(data, data+n);
    cin>>emp;
    scanf("%d",&k);
    for (int i=0; i<k; i++) {
        int s; scanf("%d",&s);
        printf("%d\n",data[s-1]);
    }
}

2378

#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
using namespace std;
int n, x, y;
bool used[100000];
vector<int> G[10000];
set<int> res;
int dfs(int np) {
    int ret=1;
    int csv=0;
    used[np]=true;
    for (int i=0; i<G[np].size(); i++) {
        if (used[G[np][i]]) continue;
        int tmp=dfs(G[np][i]);
        csv=max(csv, tmp);
        ret+=tmp;
    }
    csv=max(csv, n-ret);
    if (csv<=n/2) res.insert(np+1);
    return ret;
}
int main() {
    scanf("%d",&n);
    for (int i=0; i<n-1; i++) {
        scanf("%d%d",&x,&y);
        G[x-1].push_back(y-1);
        G[y-1].push_back(x-1);
    }
    memset(used, 0, sizeof(used));
    dfs(0);
    if (res.size()==0) puts("NONE");
    else {
        for (set<int>::iterator i=res.begin(); i!=res.end(); i++) {
            printf("%d\n",*i);
        }
    }
}

3050

#include <cstdio>
#include <set>
using namespace std;
int mp[5][5];
set<int> res;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int t[6]={100000, 10000, 1000, 100, 10, 1};
void dfs(int x, int y, int v, int cnt) {
    v+=mp[x][y]*t[cnt];
    if (cnt==5) {
        res.insert(v);
        return;
    }
    for (int i=0; i<4; i++) {
        int nx=x+dx[i], ny=y+dy[i];
        if (nx<0||nx>4||ny<0||ny>4) continue;
        dfs(nx,ny,v,cnt+1);
    }
    return;
}
int main() {
    for (int i=0; i<5; i++) for (int j=0; j<5; j++) scanf("%d",&mp[i][j]);
    for (int i=0; i<5; i++) for (int j=0; j<5; j++) dfs(i,j,0,0);
    printf("%d\n",res.size());
}

A

やるだけ

#include <cstdio>
#include <map>
#include <set>
using namespace std;
typedef pair<int, int> P;
int n, m;
set<P> ans;
int main() {
    scanf("%d%d",&n,&m);
    for (int i=0; i<=1000; i++) {
        for (int j=0; j<=1000; j++) {
            if (i*i+j==n&&i+j*j==m) ans.insert(P(i,j));
        }
    }
    printf("%d\n",ans.size());
}

B

2が二個で余り1を見逃してた…

#include <cstdio>
#include <algorithm>
using namespace std;
int n, dig[100000];
int main() {
    bool flag=false;
    scanf("%d",&n);
    int sum=0;
    for (int i=0; i<n; i++) {
        scanf("%d",&dig[i]);
        sum+=dig[i];
        if (dig[i]==0) flag=true;
    }
    if (!flag) {
        puts("-1");
        return 0;
    }
    sort(dig, dig+n);
    if (dig[n-1]==0) puts("0");
    else {
        if (sum%3==0) {
            for (int i=n-1; i>=0; i--) printf("%d",dig[i]);
            puts("");
        } else if (sum%3==1) {
            int a=-1;
            for (int i=0; i<n; i++) {
                if (dig[i]%3==sum%3) {
                    a=dig[i];
                    break;
                }
            }
            if (a==-1) {
                int cnt=0;
                for (int i=0; i<n&&cnt<2; i++) {
                    if (dig[i]%3==2) {
                        dig[i]=-1;
                        cnt++;
                    }
                }
            } else {
                for (int i=0; i<n; i++) {
                    if (dig[i]==a) {
                        dig[i]=-1;
                        break;
                    }
                }
            }
            flag=false;
            for (int i=0; i<n; i++) {
                if (dig[i]!=0&&dig[i]!=-1) flag=true;
            }
            if (!flag) puts("0");
            else {
                for (int i=n-1; i>=0; i--) if (dig[i]!=-1) printf("%d",dig[i]);
                puts("");
            }
        } else {
            int a=-1;
            for (int i=0; i<n; i++) {
                if (dig[i]%3==sum%3) {
                    a=dig[i];
                    break;
                }
            }
            if (a==-1) {
                int cnt=0;
                for (int i=0; i<n&&cnt<2; i++) {
                    if (dig[i]%3==1) {
                        dig[i]=-1;
                        cnt++;
                    }
                }
            } else {
                for (int i=0; i<n; i++) {
                    if (dig[i]==a) {
                        dig[i]=-1;
                        break;
                    }
                }
            }
            flag=false;
            for (int i=0; i<n; i++) {
                if (dig[i]!=0&&dig[i]!=-1) flag=true;
            }
            if (!flag) puts("0");
            else {
                for (int i=n-1; i>=0; i--) if (dig[i]!=-1) printf("%d",dig[i]);
                puts("");
            }
        }
    }
}

レート上がったよ!+8(しろめ)