AtCoder Beginner Contest 169

A

#include<bits/stdc++.h>
using namespace std;

int main(){
	int a, b; cin>>a>>b; cout<<a*b<<endl;
	return 0;
}

B

为了避免溢出就用 py 写了

import sys

n=int(input())
cur=1
ok=True

a = list(map(int, input().split(' ')))

for i in range(n):
	if a[i]==0:
		print(0)
		sys.exit()
	

for i in range(n):
	if cur*a[i]>int(1e18):
		print('-1')
		ok=False
		break;
	cur*=a[i]


if ok:
	print(cur)

C

#include<bits/stdc++.h>
using namespace std;

int main(){
	long long a; string t; cin>>a>>t;
	int b=0;
	for(int i=0; i<t.size(); i++) if(t[i]!='.') b=b*10+t[i]-'0';
	cout<<a*b/100;
	
	return 0;
}

D

不需要什么思维的题emm
直接质因数分解,然后暴力地划分即可。

#include<bits/stdc++.h>
using namespace std;

#define int long long

#define x first
#define y second

map<int, int> prime_factor(int x){
    map<int, int> res;
    for(int i=2; i<=x/i; i++){
        while(x%i==0){
            res[i]++;
            x/=i;
        }
    }
    if(x!=1) res[x]=1;
    return res;
}

signed main(){
	int x; cin>>x;
	auto pf=prime_factor(x);
	
	int res=0;
	for(auto i: pf){
		int cnt=i.y, t=0;
		
		int cur=1;
		while(cnt-cur>=0){
			t++;
			cnt-=cur;
			cur++;
		}
		res+=t;
	}
	cout<<res<<endl;
	
	return 0;
}

E

排序,看看中位数的范围即可。

#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define debug(x) cerr << #x << ": " << x << endl
#define pb(a) push_back(a)
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/b
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;

inline void read(int &x) {
    int s=0;x=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
    x*=s;
}

const int N=2e5+5;
int L[N], R[N];

int main(){
	int n; cin>>n;
	rep(i,1,n) read(L[i]), read(R[i]);
	
	sort(L+1, L+1+n), sort(R+1, R+1+n);
	
	int a, b, c, d;
	
	if(n&1){
		a=L[n+1>>1], b=R[n+1>>1];
		cout<<(b>=a? b-a+1: 0)<<endl;
	}
	else{
		a=L[n>>1], b=R[n>>1];
		c=L[n+2>>1], d=R[n+2>>1];
		int res=b+d-a-c+1;
		if(res>0) cout<<res<<endl; else puts("0");
	}
    return 0;
}

F

dp。
我的想法是 \(f(k,i,j)\) 表示前 \(k\) 个选取 \(i\) 个数,和为 \(j\) 的方案数,然后一边 dp 一边统计,但这样是 \(O(N^3)\) 会超时,没有想到什么优化时间的方法 qwq。

然后题解的方法是用 \(f(i,j)\) 表示前 \(i\) 个数凑出和为 \(j\) 的方案数。有:

\[f(i, j) = 2\times f(i-1, j) + f(i-1, j-w_i)~~(j\geq w_i) \]

\[f(i, j) = 2\times f(i-1, j)~~(j < w_i) \]

实在是没有想到这种滚雪球的方法,学到许多

#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define debug(x) cerr << #x << ": " << x << endl
#define pb(a) push_back(a)
#define set0(a) memset(a,0,sizeof(a))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define dwn(i,a,b) for(int i=(a);i>=(b);i--)
#define ceil(a,b) (a+(b-1))/b
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define ll_INF 0x7f7f7f7f7f7f7f7f
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;

#define int long long

inline void read(int &x) {
    int s=0;x=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-')x=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+ch-'0',ch=getchar();
    x*=s;
}

const int N=3030, mod=998244353;

int n, s;
int w[N], f[N];

signed main(){
	cin>>n>>s;
	rep(i,1,n) cin>>w[i];
	
	f[0]=1;
	rep(i,1,n){
		dwn(j,s,0){
			f[j]=(f[j]+f[j])%mod;
			if(j>=w[i]) f[j]=(f[j-w[i]]+f[j])%mod;
		}	   
	}
	cout<<f[s]<<endl;
	
    return 0;
}
posted @ 2021-07-16 21:38  HinanawiTenshi  阅读(44)  评论(0编辑  收藏  举报