首先祝大家元旦快乐呀!!!祝大家2024年一帆风顺!
A. 2023
题意:一共给你n个数字和一个k,想让你看看能否加k个数字,使全部数字乘积等于2023。
题解:暴力枚举即可,详情看代码。
代码:
#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int maxn = 1e6 + 7 ;
inline int read(){
int x = 0 , f = 1;
char c = getchar() ;
while(c > '9' || c < '0'){
if(c == '-')
f = -1 ;
c = getchar() ;
}
while(c >= '0' && c <= '9'){
x = x * 10 + c - '0' ;
c = getchar() ;
}
return x * f ;
}
int t , n , m , k , a[maxn] , b[maxn] ;
vector < int > q ;
void solve(){
n = read() ;
k = read() ;
q.clear() ;
int sum = 1 ;
map < int , int > mp ;
for(int i = 1 ; i <= n ; i ++){
a[i] = read() ;
if(2023 % a[i] == 0){
sum = sum * a[i] ;
q.push_back(a[i]) ;
mp[a[i]] ++ ;
}
}
sort(q.begin() , q.end() , greater<>()) ;
if(sum > 2023 || (int)q.size() != n){
printf("NO\n") ;
return ;
}
if(mp[119] > 1 || mp[17] > 2 || mp[7] > 1 || mp[2023] > 1 || mp[289] > 1){
cout << "NO\n" ;
return ;
}
int res = 2023 / sum ;
if(k == 3){
printf("YES\n") ;
cout << 1 << " " << 1 << " " << res << endl ;
return ;
}
if(k == 2){
printf("YES\n") ;
cout << 1 << " " << res << endl ;
return ;
}
if(k == 1){
printf("YES\n") ;
cout << res << endl ;
return ;
}
if(k == 4){
printf("YES\n") ;
cout << 1 << " " << 1 << " " << 1 << " " << res << endl ;
return ;
}
if(k == 5){
printf("YES\n") ;
cout << 1 << " " << 1 << " " << 1 << " " << 1 << " "<< res << endl ;
return ;
}
}
int main(){
t = read() ;
while(t --){
solve() ;
}
return 0 ;
}
B. Two Divisors
题意:给你两个数字a和b。 ,看看能否找到一个x,使a和b是x()的两个最大因子。
题解:首先可以看出,如果b是a的倍数,那么答案就是 ,这很好理解,因为a是b的因子,所以的最大两个因子一定是a和b。如果不是倍数,那么直接输出 。
代码:
#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int maxn = 1e6 + 7 ;
inline ll read(){
ll x = 0 , f = 1;
char c = getchar() ;
while(c > '9' || c < '0'){
if(c == '-')
f = -1 ;
c = getchar() ;
}
while(c >= '0' && c <= '9'){
x = x * 10 + c - '0' ;
c = getchar() ;
}
return x * f ;
}
ll t , n , m , k , a[maxn] , b[maxn] ;
char s[maxn] ;
void solve(){
n = read() ;
m = read() ;
if(m % n == 0){
cout << m * (m / n) << endl ;
return ;
}
ll res = n * m / __gcd(n , m) ;
if(res != n && res != m){
cout << res << endl ;
return ;
}
cout << (n * m / __gcd(n , m)) * min(n , m) << endl ;
}
int main(){
t = read() ;
while(t --){
solve() ;
}
return 0 ;
}
C. Training Before the Olympiad
题意:有两个玩家Masha和Olya,Masha先行,一共给你n个数字,每次操作可以合并和,将他们合并成一个数字,输出最后合并剩下的一个答案,除以是下取整。Masha想让最后留下来的数字最大,Olya想让最后留下来的数字最小,每个人都用最优的方法来进行,问长度为 的a数组,最后留下的数字最大是多少。
题解:因为是下取整,很容易想到会不会损失1的问题,所以看奇偶性,如果两个偶数或者两个奇数,那么不会有损失,的值就是 。 如果是一个奇数一个偶数那么答案相加下取整再乘2就是。所以问题就在于奇数的个数。分析到这里,做法也很明确了。Masha会优先合并两个奇数,Olya会优先让一个奇数和一个偶数搭配,这样答案就减少1。枚举奇数个数会发现,个奇数会减少,所以,如果(ji %3 == 1),那么答案会减少,如果(ji % 3 == 0),那么答案会减少。整体复杂度
备注:一开始傻了没想到(ji % 3 == 1)会多减一,Wa了两发,寄!
代码:
#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int maxn = 2e6 + 7 ;
inline ll read(){
ll x = 0 , f = 1;
char c = getchar() ;
while(c > '9' || c < '0'){
if(c == '-')
f = -1 ;
c = getchar() ;
}
while(c >= '0' && c <= '9'){
x = x * 10 + c - '0' ;
c = getchar() ;
}
return x * f ;
}
ll t , n , m , k , a[maxn] , b[maxn] ;
ll sum[maxn] ;
void solve(){
n = read() ;
for(int i = 1 ; i <= n ; i ++){
a[i] = read() ;
}
sum[0] = 0 ;
for(int i = 1 ; i <= n ; i ++){
sum[i] = sum[i - 1] + a[i] ;
}
ll ji = 0 ;
for(int i = 1 ; i <= n ; i ++){
if(a[i] % 2 == 1){
ji ++ ;
}
if(i == 1){
cout << a[i] << " " ;
continue ;
}
if(ji % 3 == 1){
cout << sum[i] - (ll)((ji + 3 - 1) / 3) << " " ;
continue ;
}
if(ji == 0){
cout << sum[i] << " " ;
continue ;
}
if(ji == 1){
cout << sum[i] - 1ll << " " ;
continue ;
}
if(ji == 2){
cout << sum[i] << " " ;
continue ;
}
if(ji == 3){
cout << sum[i] - 1ll << " " ;
continue ;
}
if(ji == 4){
cout << sum[i] - 2ll << " " ;
continue ;
}
if(ji >= 5){
cout << sum[i] - (ll)(ji / 3ll) << " " ;
continue ;
}
}
cout << endl ;
}
int main(){
t = read() ;
while(t --){
solve() ;
}
return 0 ;
}
喜欢作者的可以点点赞,点个宝贵的关注哦~
有问题可以私信作者,提出你的宝贵建议~