C/C++大学第13回ブルーブリッジカップソフトウェアコンペティション県大会のグループBのまとめ
ヒント: コードはコンテスト中に私が提出したコードであり、正しい解決策であるとは限りません。! !
質問A: 9 から 10 進数
暴力
1478
質問B:伊達順子
012 は QAQ としてカウントされません! ! ! ! ! ! !
とにかく、それは暴力でもあります. チームメイトの答えによると、それはそうあるべきです
4
テスト問題C:ブラシ問題の統計
x 週間 + y 日かかると仮定すると、必要な週数がすぐにわかり、ゆっくりと引いてさらに数日を得ることができます。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 1e5+9;
int main(){
ll a,b,n;
scanf("%lld %lld %lld",&a,&b,&n);
ll num = n/(5*a+2*b);
n = n - num*(5*a+2*b);
num = num*7;
for(int i = 1;i <= 7;i++){
if(n <= 0) break;
if(i <= 5){
n -= a;
num++;
}else{
n -= b;
num++;
}
}
printf("%lld",num);
return 0;
}
テスト問題D:低木の剪定
i 番目の茂みがどのように最も高くなるか、つまり、アリスは現在の茂みから i を左に切り戻し、i を右に切り戻し、どちらが高いかを調べます。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 1e5+9;
int n;
int a[N];
int maxx[N];
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++){
maxx[i] = max(2*(i-1),2*(n-i));
}
for(int i = 1;i <= n;i++){
printf("%d\n",maxx[i]);
}
return 0;
}
テスト問題E:基数 X での減算
a は b より大きいため、ab をできるだけ小さくしたい場合は、各ビットのベースをできるだけ小さくする必要があります。
pa[i] は i+1 桁目の 1 のサイズを 10 進数に変換したものを表します
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 1e6+9;
const ll mod = 1e9+7;
ll pow_mod(ll a,ll b){
ll ans = 1;
ll base = a;
while(b){
if(b&1) ans = (ans * base) % mod;
base = (base * base) % mod;
b >>= 1;
}
return ans;
}
ll n;
ll a[N];
ll b[N];
ll na,nb;
ll pa[N];
int main(){
scanf("%lld",&n);
scanf("%lld",&na);
for(ll i = 1;i <= na;i++){
scanf("%lld",&a[i]);
}
reverse(a+1,a+1+na);
scanf("%lld",&nb);
for(ll i = 1;i <= nb;i++){
scanf("%lld",&b[i]);
}
reverse(b+1,b+1+nb);
ll p = max(na,nb);
ll ans = 0;
pa[0] = 1;
for(ll i = 1;i <= p;i++){
ll maxx = max(a[i],b[i]);
ll x = max(2ll,maxx + 1);
pa[i] = (pa[i-1]*x)%mod;
ans = (ans + a[i]*pa[i-1] - b[i]*pa[i-1] + mod) % mod;
}
printf("%lld",ans);
return 0;
}
質問F:統計サブマトリックス
ゲーム中に複雑さを誤算し、二次元の接頭辞と暴力で計算しました。70点
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 5e2+9;
ll a[N][N];
ll pre[N][N];
ll work(int x1,int y1,int x2,int y2){
return pre[x2][y2] - pre[x1-1][y2] - pre[x2][y1-1] + pre[x1-1][y1-1];
}
int main(){
ll ans = 0;
ll n,m,k;
scanf("%lld %lld %lld",&n,&m,&k);
for(ll i = 1;i <= n;i++){
for(ll j = 1;j <= m;j++){
scanf("%lld",&a[i][j]);
pre[i][j] = pre[i-1][j] + pre[i][j-1] - pre[i-1][j-1] + a[i][j];
}
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
for(int p = i;p <= n;p++){
for(int l = j;l <= m;l++){
ll x = work(i,j,p,l);
if(x <= k) ans++;
}
}
}
}
printf("%lld",ans);
return 0;
}
テスト問題G:ブロック図
しません!! ! ! ! ! !
質問H:マインスイーパ
Lei と Lei の関係に従って有向グラフを作成します. 最大 r は 10 であるため、平面上の最大 20*20 点を見つけるだけで済み、マップを使用してグラフを保存する必要があることに注意してください.競技中に複雑さを数えなくても合格できる. 計算後、50000 * 20 * 20 * log(50000) は少し限界です. 評価マシンが十分に速いことを願っています.
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 1e6+9;
struct node{
ll x,y,r;
}e[N];
vector<int> g[N];
map<pair<ll,ll> ,int> mp;
ll dis(ll x1,ll y1,ll x2,ll y2){
return (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
}
int vis[N];
void dfs(int now){
if(vis[now]) return ;
vis[now] = 1;
for(int i = 0;i < g[now].size();i++){
int to = g[now][i];
if(!vis[to]) dfs(to);
}
}
int main(){
ll n,m,r;
scanf("%lld %lld %lld",&n,&m,&r);
for(ll i = 1;i <= n;i++){
scanf("%lld %lld %lld",&e[i].x,&e[i].y,&e[i].r);
mp[make_pair(e[i].x,e[i].y)] = i;
}
for(int k = 1;k <= n;k++){
for(int i = -e[k].r;i <= e[k].r;i++){
for(int j = -e[k].r;j <= e[k].r;j++){
ll xx = e[k].x+i,yy = e[k].y+j;
if(dis(e[k].x,e[k].y,xx,yy) <= e[k].r*e[k].r){
if(mp[make_pair(xx,yy)]){
g[k].push_back(mp[make_pair(xx,yy)]);
}
}
}
}
}
for(ll k = 1;k <= m;k++){
for(int i = -e[k].r;i <= e[k].r;i++){
for(int j = -e[k].r;j <= e[k].r;j++){
ll xx = e[k].x+i,yy = e[k].y+j;
if(dis(e[k].x,e[k].y,xx,yy) <= e[k].r*e[k].r){
if(mp[make_pair(xx,yy)]){
int now = mp[make_pair(xx,yy)];
if(!vis[now])
dfs(now);
}
}
}
}
}
ll ans = 0;
for(int i = 1;i <= n;i++){
if(vis[i]) ans++;
}
printf("%lld",ans);
return 0;
}
テスト問題I:李白大九強化版
3 次元の dp の場合、d[i] [j] [k] を定義して、最初の i か所、j 店舗に行った後、残りの k バケツのワインにどれだけの状況があるかを示します。
花は最後に遭遇する必要があるため、d[n+m] [n] [0] は d[n+m-1] [n] [1] からのみ転送する必要があるため、d[n+m -1 を出力します。 ][n][1]
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long ll;
const ll N = 2e2+9;
const ll mod = 1000000007;
ll d[N][N][N];
ll n,m;
int main(){
d[0][0][2] = 1;
scanf("%lld %lld",&n,&m);
ll ans = 0;
for(int i = 1;i <= n+m;i++){
for(int j = 0;j <= n;j++){
for(int k = 0;k <= m;k++){
if(i != n+m){
if(d[i-1][j][k]){
if(k > 0){
d[i][j][k-1] = (d[i][j][k-1] + d[i-1][j][k])%mod;
}
if(k*2 <= m){
d[i][j+1][k*2] = (d[i][j+1][k*2] + d[i-1][j][k])%mod;
}
}
}
}
}
}
printf("%lld",d[n+m-1][n][1]);
return 0;
}
テスト問題J:竹を切る
QAQ を書いた後、読む時間がない