A. Domino on Windowsill
题意:先给你三个数n,k1,k2,分别是在第一行和第二行能放白块位置的大小,然后告诉你a(白块),b(黑块)的数量,且大小都是2x1,横竖都可以,看能否把a+b个库洛米摆下。
思路:用白色的块找下规律,同理找黑色块规律即可。
#include<bits/stdc++.h> using namespace std; int main() { int k1,k2,t,i,j,a,b,w,n; cin>>t; while(t--){ cin>>n>>k1>>k2>>w>>b; int ans1=0,ans2=0; ans1=min(k1,k2)+abs(k1-k2)/2; int he1=n-k1,he2=n-k2; ans2=min(he1,he2)+abs(he1-he2)/2; if(ans1>=w&&ans2>=b){ cout<<"YES"<<endl; } else { cout<<"NO"<<endl; } } }
B. Binary Removals
题意:题面很复杂,大概就是说不能删除连续的位置的字符,问是否能删成一个递增的序列,求该序列只有0,1两种字符。
思路:找不能的情况很明显就是当出现11之后出现00的情况。\
#include<bits/stdc++.h> using namespace std; int main() { string s1; int n,i,j,t; cin>>t; while(t--){ cin>>s1; int flag=0,f1=0; for(i=0;i<s1.length()-1;i++){ if(s1[i]=='1'&&s1[i+1]=='1'){ flag=1; } if(flag==1){ if(s1[i]=='0'&&s1[i+1]=='0') f1=1; } } if(f1==1){ cout<<"NO"<<endl; } else { cout<<"YES"<<endl; } } }
C. Minimum Grid Path
题意:从原点出发,目标是N*N,且走的方向只有右和上,很明显向上n次,向右n次,且题目给出每一次行走的路径所要的消耗Ci,自己选择行走的长度,求最少的话费。
思路:首先把所给的数组看成两部分,每隔一个数就是相同的部分,然后去选,因为如果我要找最小的情况需要考虑之前的花费如果太大了则可能不是最优解,所以用前缀和先存下选到当前位置所需要的话费再累乘一下,注意数据范围。
#include<bits/stdc++.h> using namespace std; #define int long long const int maxn=1e5+10000; int a[maxn],sum[maxn]; signed main() { int n,i,j,t; cin>>t; while(t--){ cin>>n; memset(sum,0,sizeof(sum)); for(i=1;i<=n;i++){ cin>>a[i]; } sum[1]=a[1]; for(i=2;i<=n;i++) sum[i]+=(sum[i-1]+a[i]); int cnt1=1,cnt2=0,min1=a[1],min2=a[2],ans; for(i=2;i<=n;i++){ if(i==2){ cnt2++; ans=sum[i]+(n-cnt1)*min1+(n-cnt2)*min2; } else if(i%2==0){ cnt2++; min2=min(a[i],min2); ans=min(ans,sum[i]+(n-cnt1)*min1+(n-cnt2)*min2); } else { cnt1++; min1=min(a[i],min1); ans=min(ans,sum[i]+(n-cnt1)*min1+(n-cnt2)*min2); } } cout<<ans<<endl; } }
总结:
C题一开始想dp,后来觉得太复杂,准备放弃的时候看到有三千人过了=。=估计是个思维,想了想就出来了,果然自信最重要了呢。