A - Raining(水题)
思路:读清题意即可。
AC Code:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
const int mod=1e9+7;
const int N=105;
int a,b,c,d,x;
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
std::cin>>a>>b>>c>>d>>x;
std::cout<<std::max(0,x-a)<<' '<<std::max(0,x-b)<<' '<<std::max(0,x-c)<<' '<<std::max(0,x-d)<<'\n';
return 0;
}
B - Kissing(数学化简)
思路:根据完全平方公式和平方差公式化简所求,发现前n项和为n*n,注意取模,开ll。
AC Code:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
const int mod=998244353;
const int N=105;
ll n;
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
std::cin>>n;
n%=mod;
std::cout<<n*n%mod<<'\n';
return 0;
}
C - Missing(字符串,暴力)
思路:暴力模拟,注意特殊情况判断,题意很清楚了。
AC Code:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
const int mod=998244353;
const int N=105;
std::string s;
std::string a[N];
int n;
struct node{
std::string s;
double sim;
} e[N],ans[N];
bool cmp1(node a,node b){
if(a.sim>b.sim) return true;
else return false;
}
bool cmp2(node a,node b){
if(a.s<b.s) return true;
else return false;
}
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
std::cin>>s;
int len=s.length();
std::cin>>n;
for(int i=0;i<n;i++){
std::cin>>a[i];
e[i].s=a[i];
if(a[i].length()!=len) e[i].sim=0;
else{
double cnt=0;
for(int j=0;j<len;j++){
if(s[j]==a[i][j]) cnt++;
}
e[i].sim=cnt/len;
}
}
std::sort(e,e+n,cmp1);
if(e[0].sim==0){
std::sort(e,e+n,cmp2);
for(int i=0;i<n;i++){
std::cout<<e[i].s<<'\n';
}
return 0;
}
int tot=0;
for(int i=0;i<n;i++){
ans[i].s=e[i].s;
tot++;
if(e[i+1].sim!=e[i].sim) break;
}
std::sort(ans,ans+tot,cmp2);
for(int i=0;i<tot;i++){
std::cout<<ans[i].s<<'\n';
}
return 0;
}
os:前三题太慢了,我直接掉大分
D - Breezing(DP)
思路:首先有一个结论,最优方案的每个数,要么是1,要么是b[i]。对于这样的结论,我们采用DP,令f[i][j]表示第i个数结尾,状态为j时的最大值(j=0时,第i个数为1;j=1时,第i个数为b[i]),线性转化,时间复杂度O(n),能过。
AC Code:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
const int mod=998244353;
const int N=1e5+5;
int n;
int a[N];
int f[N][2];
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
std::cin>>n;
for(int i=1;i<=n;i++){
std::cin>>a[i];
}
for(int i=2;i<=n;i++){
f[i][0]=std::max(abs(1-1)+f[i-1][0],abs(1-a[i-1])+f[i-1][1]);
f[i][1]=std::max(abs(a[i]-1)+f[i-1][0],abs(a[i]-a[i-1])+f[i-1][1]);
}
std::cout<<std::max(f[n][1],f[n][0])<<'\n';
return 0;
}
os:一开始想到可能是DP,但是对DP太不熟练,不知道DP可以O(n)这样写。。。
E - Calling
思路:先贪心放较大的,很显然,对于边长为4,5,6的,只能一个框里放一个;对于边长为3的,一个框可以放4个,注意答案加s/cnt向上取整,cnt指边长为3的个数。对于边长为2的,可以和边长为4的放在一个框中,一个框还可以再放5个;可以和边长为3的放在一个框中,注意分该框中有几个边长为3的分类。对于边长为1的,哪里有空就可以放在哪。
AC Code:
#include <bits/stdc++.h>
typedef long long ll;
typedef std::pair<int,int>PII;
const int N=2e4+5;
int t,s;
double a,b,c,d,e,f;
int main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cout.tie(0);
std::cin>>t;
while(t--){
std::cin>>s;
std::cin>>a>>b>>c>>d>>e>>f;
int ans=d+e+f+ceil(c/4);
int putB=d*5;
if((int)c%4!=0){
if((int)c%4==1) putB+=5;
if((int)c%4==2) putB+=3;
if((int)c%4==3) putB+=1;
}
if(b>putB){
ans+=ceil((b-putB)/9);
}
int res=6*6*f+5*5*e+4*4*d+3*3*c+2*2*b;
int putA=6*6*ans-res;
if(a>putA) ans+=ceil((a-putA)/36);
std::cout<<(ans<=s?"Yes":"No")<<'\n';
}
return 0;
}
os:标程真的超简洁
若有错误请指教,谢谢!