高橋くんは、上司から
会社で作っている N 個のソフトウェアに平均でどれくらいのバグがあるか調べろ
ただし、バグがないソフトは調査母数に含めるな
と指示されました。
しかも、上司は小数が嫌いです。とはいえ、バグ数の平均値を過小報告するわけにもいかないので、値を切り上げて報告することにしました。
高橋くんは、素早くバグ数の平均値をまとめて上司に報告する必要があります。 ソフトウェアごとのバグ数が与えられるので、バグが含まれるソフトウェアの、バグ数の平均値を小数で切り上げて求めてください。
切り上げのテクニック
AをBで割った値を切り上げたい。
if(a&b==0){
c=a/b;
}else{
c= a/b+1;
}
としてもよいがどうも長い。もっとスマートに書くには、
(a+(b-1))/b
これで切り上げになる。
# include <iostream>
using namespace std;
int main(){
int N;
int A[110];
int ans=0;
int zero = 0;
cin >> N;
for (int i = 0; i < N; ++i) {
cin >> A[i];
if (A[i] == 0) {
zero++;
}
ans += A[i];
}
int num = N - zero;
if (num == 0)
cout << 0 << endl;
else
cout << (ans + num - 1 )/ num << endl;
return 0;
}
C
# include<iostream>
# include<algorithm>
# include<vector>
# include<string>
# include<list>
# include<cmath>
# include<map>
using namespace std;
using ll = long long;
const int INF = 1e9;
# define rep(i,n)for(int i=0;i<n;++i)
# define p pair<int,int>
int N, K;
int T[10][10];
bool dfs(int i, int x) {
if (i == N) {
return x == 0;
}
for (int m = 0; m < K; ++m) {
if (dfs(i + 1, x^T[i][m])) {
return true;
}
}
return false;
}
int main() {
cin >> N >> K;
for (int i = 0; i < N; ++i) {
for (int j = 0; j < K; ++j) {
cin >> T[i][j];
}
}
if (dfs(0, 0)) {
cout << "Found" << endl;
}
else {
cout << "Nothing" << endl;
}
return 0;
}
再帰。なんかもやもやするな、
D
# include<iostream>
# include<vector>
# include<algorithm>
# include<string>
# include<map>
# include<math.h>
# include<queue>
# include<deque>
# include<stack>
# include<cstdio>
# include<utility>
# include<set>
# include<list>
# include<cmath>
# include<stdio.h>
# include<string.h>
# include<cstdio>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using piii = pair<pii, pii>;
const int INF = 1e9 + 7;
int main() {
int W;
int N, K;
int A[51], B[51];
int dp[51][51][10010];
cin >> W >> N >> K;
for (int i = 0; i < N; ++i) {
cin >> A[i] >> B[i];
}
for (int i = 0; i < 51; ++i) {
for (int j = 0; j < 51; ++j) {
for (int k = 0; k < 10010; ++k) {
dp[i][j][k] = 0;
}
}
}
for (int i = 0; i < N; ++i) {
for (int j = 0; j < K; ++j) {
for (int k = 0; k <=W; ++k) {
if (k >= A[i]) {
dp[i + 1][j + 1][k] = max({ dp[i][j + 1][k], dp[i][j][k],dp[i][j][k - A[i]] + B[i] });
}
else {
dp[i + 1][j + 1][k] = max(dp[i][j][k], dp[i][j + 1][k]);
}
}
}
}
cout << dp[N][K][W] << endl;
return 0;
}
dp