はい。
https://atcoder.jp/contests/abc118
A - B +/- A
#include<bits/stdc++.h>
using namespace std;
#define sc2(a,b) scanf("%d %d",&a,&b)
int main(){
int a,b;
sc2(a,b);
printf("%d\n",b%a==0?a+b:b-a);
return 0;
}
a,b=map(int,input().split())
print([b-a,a+b][b%a==0])
問題文の指示通りに+と-を計算する。
B - Foods Loved by Everyone
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;++i)
#define sc1(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d %d",&a,&b)
int ans[35];
int main(){
int mod=1000000007;
int n,m,cnt=0;
int k,p;
sc2(n,m);
rep(i,n) {
sc1(k);
rep(j,k) {
sc1(p);
ans[p]+=1;
}
}
rep(i,33) if(ans[i]==n) cnt++;
printf("%d\n",cnt);
return 0;
}
n,m=map(int,input().split())
l=set([i+1 for i in range(m)])
for i in range(n):
k=[int(j) for j in input().split()]
t=set([k[j+1] for j in range(k[0])])
l=l&t
print(len(l))
1からmまでを用意する。各行の好きなものと重複してるものだけ残して最後に残ったのが全ての人が好きと答えたものという感じで処理してました。
最初に1からmまで用意しても1人目の処理でその1人目の好きなものしか残らないので、特に意味はないのですけどforの中で1人目とそれ以外で分岐が必要になったりするのでソースの長さはあまり変わらないんじゃないかと。書きやすい書き方でいいと思います。
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;++i)
#define sc1(a) scanf("%d",&a)
set <int> a; set <int> b;
int main(){
int mod=1000000007;
int x,n,p=mod,cnt=0,tmp1=mod,tmp2=mod;
sc1(n);
rep(i,n) {
sc1(x);
tmp1=min(tmp1,x);
a.insert(x);
}
for(;;) {
cnt++;
if (cnt%2) {
for (;;) {
if (a.size()==0) break;
auto bb = *a.begin();
b.insert(bb%tmp1?bb%tmp1:tmp1);
tmp2=min(tmp2,bb%tmp1?bb%tmp1:tmp1);
a.erase(a.begin());
}
tmp1=mod;
} else {
for(;;) {
if (b.size()==0) break;
auto aa = *b.begin();
a.insert(aa%tmp2?aa%tmp2:tmp2);
tmp1=min(tmp1,aa%tmp2?aa%tmp2:tmp2);
b.erase(b.begin());
}
tmp2=mod;
}
if (a.size()==1) { printf("%d\n",tmp1); break; }
else if (b.size()==1) { printf("%d\n",tmp2); break; }
}
return 0;
}
n=int(input())
l=[int(i) for i in input().split()]
x=ans=min(l)
while 1:
t=[-1,-1]
for i,j in enumerate(l):
if j%x and ans>j%x:
ans=j%x
t[0]=i
t[1]=ans
l[t[0]]=ans
x=ans
if t[0]==-1: break
print(x)
はい、この操作で残るのほんとに最大公約数に必ずなるのかな。とAC出ても不安だったんですけども最後に数列の全ての数と剰余が出なくなってから解を確定させているので最大公約数で間違いないです。多分
C++はPythonでのsetからpopで取り出す相当のことするのが面倒でした。本当は他の方法があるのかもしれませんが。順番を保証するかどうかでsetは2種類が。
D - Match Matching
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;++i)
#define sc1(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d %d",&a,&b)
int dp[10][10015];
bool c[15];
int main(){
int a,n,m;
sc2(n,m);
rep(i,m) { sc1(a); c[a]=1; }
int b[10]={0,2,5,5,4,5,6,3,7,6};
rep(i,n+3) {
bool f=0;
rep(j,10) {
int x=b[j];
if (c[j]==0 || (i>0 && dp[0][i]==0)) continue;
if (dp[0][i]+1>dp[0][i+x]) {
f=1;
} else if (dp[0][i]+1==dp[0][i+x]) {
for (int k=9;k>0;k--) {
if ((dp[k][i]+(j==k))>dp[k][i+x]) {f=1; break;}
if ((dp[k][i]+(j==k))<dp[k][i+x]) {f=0; break;}
}
}
if (f) {
for (int k=1;k<10;k++) dp[k][i+x]=dp[k][i];
dp[0][i+x]=dp[0][i]+1;
dp[j][i+x]++;
}
}
}
for (int i=9;i>0;i--) if (dp[i][n]>0) rep(j,dp[i][n]) printf("%d",i);
puts("");
return 0;
}
dp配列は1次元配列で出来るらしいです。dp[0][w]にはw本使っているときには何桁の数字なのか、dp[v][w]にはw使っているときに数字vを何個使っているかを入れています。