A:https://codeforces.com/contest/1221/problem/A
题意:
给出n个数字,问你是否能组成2048,和2048小游戏一摸一样
题解:
前缀和
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int q,n;
ll a[105],pre[105],x;
int main()
{
scanf("%d",&q);
while(q--)
{
int cnt = 0,flag = 0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
pre[i] = 0;
scanf("%lld",&x);
if(x <= 2048){
a[++cnt] = x;
}
}
sort(a+1,a+1+cnt);
for(int i=1;i<=cnt;i++){
pre[i] += (pre[i-1]+a[i]);
}
for(int i=cnt;i>=1;i--){
for(int j=i-1;j>=0;j--)
{
if(pre[i] - pre[j] == 2048){
flag = 1;
}
}
}
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}B:https://codeforces.com/contest/1221/problem/B
题意:
构造题,在n*n的棋盘上,每个位置可以放白棋或者黑棋,最大化之间的斗争值,
即(x1,y1)和(x2,y2)满足棋的颜色不同且|x1−x2|=2 and |y1−y2|=1 或者 |x1−x2|=1 and |y1−y2|=2,俩个棋就会产生斗争
题解:
当你写出来3和4的棋盘,你就得出答案来了
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int a[110][110];
int main()
{
int n;
scanf("%d",&n);
int now = 1;
for(int i=1;i<=n;i++){
a[i][1] = 1^now;
now ^= 1;
}
for(int i=1;i<=n;i++)
{
for(int j=2;j<=n;j++)
{
if(a[i][j-1])
a[i][j] = 0;
else
a[i][j] = 1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j])
cout<<"W";
else
cout<<"B";
}
cout<<endl;
}
return 0;
}C:https://codeforces.com/contest/1221/problem/C
题意:
给出a,b,c,三种职位的人数。每个组都必须要有a和b这俩种不同职位的人,c为无职业者,问你最多能有多少组
题解:
分类讨论
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll c, m,x;
scanf("%lld%lld%lld",&c,&m,&x);
if(c == 0 || m == 0){
cout<<"0"<<endl;
continue ;
}
ll minn = min(c,min(m,x));
if(minn == c || minn == m){
cout<<minn<<endl;
continue ;
}
c -= x,m -= x;
cout<<minn + min((c+m)/3,min(c,m))<<endl;
}
return 0;
}D:https://codeforces.com/contest/1221/problem/D
题意:
给出n块木板的高度和每块木板升高一米的代价,要求任意俩块相邻的木板的高度不能相同最小的代价
题解:
dp,我们能发现,每块木板最多可以升高2m,升高再多都是没有意义的,只会使得代价更大
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 300005;
ll a[maxx],b[maxx],dp[maxx][4];
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&a[i],&b[i]);
}
dp[1][0] = 0ll;
dp[1][1] = b[1];
dp[1][2] = 2ll*b[1];
for(int i=2;i<=n;i++)
{
if(a[i-1] == a[i]){
dp[i][0] = min(dp[i-1][1] , dp[i-1][2]);
dp[i][1] = b[i] + min(dp[i-1][0] , dp[i-1][2]);
dp[i][2] = 2ll*b[i] + min(dp[i-1][0] , dp[i-1][1]);
}
else if(a[i-1] + 1ll == a[i]){
dp[i][0] = min(dp[i-1][0] , dp[i-1][2]);
dp[i][1] = b[i] + min(dp[i-1][0] , dp[i-1][1]);
dp[i][2] = 2ll*b[i] + min(dp[i-1][0],min(dp[i-1][1] , dp[i-1][2]));
}
else if(a[i-1] + 2ll == a[i]){
dp[i][0] = min(dp[i-1][0] , dp[i-1][1]);
dp[i][1] = b[i] + min(dp[i-1][0] , min(dp[i-1][1] , dp[i-1][2]));
dp[i][2] = 2ll*b[i] + min(dp[i-1][0] , min(dp[i-1][1] , dp[i-1][2]));
}
else if(a[i-1] - 2ll == a[i]){
dp[i][0] = min(dp[i-1][0] , min(dp[i-1][1] , dp[i-1][2]));
dp[i][1] = b[i] + min(dp[i-1][0] , min(dp[i-1][1] , dp[i-1][2]));
dp[i][2] = 2ll*b[i] + min(dp[i-1][1] , dp[i-1][2]);
}
else if(a[i-1] - 1ll == a[i]){
dp[i][0] = min(dp[i-1][0] , min(dp[i-1][1] , dp[i-1][2]));
dp[i][1] = b[i] + min(dp[i-1][1] , dp[i-1][2]);
dp[i][2] = 2ll*b[i] + min(dp[i-1][0] , dp[i-1][2]);
}
else{
dp[i][0] = min(dp[i-1][0] , min(dp[i-1][1] , dp[i-1][2]));
dp[i][1] = b[i]+min(dp[i-1][0] , min(dp[i-1][1] , dp[i-1][2]));
dp[i][2] = 2ll*b[i]+min(dp[i-1][0] , min(dp[i-1][1] , dp[i-1][2]));
}
}
cout<<min(dp[n][0],min(dp[n][1],dp[n][2]))<<endl;
}
return 0;
}
京公网安备 11010502036488号