ABC 注意小坑即可
D-Breezing
读题即可发现,每个位置都是选择边界值才能使答案最大,故dp即可;
dp[i][0]表示第i个位置选择1,dp[i][1]表示第i个位置选择Bi,然后转移即可。
#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
int dp[Max][2];
int a[Max];
int main(){
int n;sc(n);
for(int i=1;i<=n;i++) sc(a[i]);
for(int i=2;i<=n;i++){
dp[i][0]=max(abs(1-1)+dp[i-1][0],abs(a[i-1]-1)+dp[i-1][1]);
dp[i][1]=max(abs(a[i]-1)+dp[i-1][0],abs(a[i-1]-a[i])+dp[i-1][1]);
}
cout<<max(dp[n][0],dp[n][1])<<endl;
}
E-Calling
贪心即可,边长为4,5,6的正方形显然一张纸片就要一个框,多余的部分先放放边长为2的,没填满再放边长为1的正方形;边长为3的正方形,一个框可放4个,多余的部分先放放边长为2的,没填满再放边长为1的正方形;边长为2的正方形,一个框可放9个,多余的部分放边长为1的正方形;边长为2的正方形,哪里有空往哪放。
#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
ll a[Max];
int main(){
int t;sc(t);
while(t--){
int n;sc(n);
for(int i=1;i<=6;i++) sl(a[i]);
bool flag=true;
for(int i=6;i>=1;i--){
if(a[i]<=0) continue;
if(i==6) n-=a[i];
if(i==5){
n-=a[i];a[1]-=(a[i]*11);
}
if(i==4){
n-=a[i];
ll ans=a[i]*5;
if(a[2]>=ans) a[2]-=ans;
else a[2]=0,a[1]-=(ans-a[2])*4;
}
if(i==3){
if(a[i]%4==0) n-=a[i]/4;
else{
n-=a[i]/4;n--;
ll ans;
if(a[i]%4==1) ans=5;
else if(a[i]%4==2) ans=3;
else if(a[i]%4==3) ans=1;
if(a[2]>=ans) a[2]-=ans;
else{
a[2]=0;
ll num=36-(a[i]%4)*9-ans*4;
a[1]-=num;
}
}
}
if(i==2){
if(a[i]%9==0) n-=a[i]/9;
else{
n-=a[i]/9;n--;a[i]=0;
a[1]-=(36-(a[i]%9)*4);
}
}
if(i==1){
if(a[i]%36==0) n-=a[i]/36;
else n-=a[i]/36,n--;
}
if(n<0) flag=false;
}
if(flag) printf("Yes\n");
else printf("No\n");
}
}
F-Freezing
下面是官方题解
这里我觉着可以将dp[x][y]理解为,以前八位为x,后八位与y相与为0组成的16位二进制数结尾的所有可能性!!!
#include <bits/stdc++.h>
using namespace std;
#define sc(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define ll long long
#define pb push_back
typedef pair<int,int>PII;
const int Max=1e6+5;
const ll INF=1e15+5;
const int mod=998244353;
// ll a[Max];
ll dp[1<<8][1<<8];
int main(){
int n,m;
sc(n);sc(m);
ll ans=0;
while(n--){
string str;cin>>str;
int a=0;
for(int i=0;i<m;i++){
a=(a<<1)|(str[i]=='o');
}
int x=a>>8,y=a&255;ll z=1;
for(int i=0;i<(1<<8);i++){
if(!(x&i)){
z+=dp[i][y];z%=mod;
}
}
ans+=z;ans%=mod;
for(int i=0;i<(1<<8);i++){
if(!(y&i)){
dp[x][i]+=z;dp[x][i]%=mod;
}
}
}
cout<<ans<<endl;
}
总结:D题没有瞬间想到dp,E代码有很多小错误wrong了好久,F是一个很妙的trick!!!