A - New Year Garland
签到:最小两个相加<最大-1:no
int main(){ int T; cin>>T; while(T--){ int a,b,c; cin>>a>>b>>c; if(a>b)swap(a,b); if(a>c)swap(a,c); if(b>c)swap(b,c); if((a+b)<c-1)cout<<"No"<<endl; else cout<<"Yes"<<endl; } return 0; }
B - Verse For Santa
题意:给一个数组,可以去掉任意一个元素,满足最多的元素和小于s,求去掉元素的位置。
只能从左到右一个一个求和。
解:从左加到右,并且记录最大值,如果溢出s,就去掉最大值就可以了。
typedef long long ll; const int MAXN=1e5+10; int a[MAXN]; int main(){ int T; cin>>T; while(T--){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } int res=0; int maxx=0; int maxid=0; for(int i=1;i<=n;i++){ res+=a[i]; if(maxx<a[i])maxx=a[i],maxid=i; if(res>m){ break; } } if(res>m) cout<<maxid<<endl; else cout<<0<<endl; } return 0; }
C - Stack of Presents
题意:圣诞老人有一个礼物袋,这个袋子像一个栈,a[1]表示栈顶,拿出中间的一个礼物,要把它上面的礼物拿出来,然后取出要的礼物,再把拿出来上面的礼物放回去。
然后有一个礼物派送清单,如果礼物正好在栈顶只需要花1秒的时间就可以拿出来,如果不在栈顶,假设前面有k个,那么拿出来就需要2∗k+12∗k+1秒时间。
然后你可以选择任意的顺序把拿出来的礼物放回去。
求送完礼物清单最少需要花多少时间。
解:贪心。假设你已经拿出来k件礼物,那么如果下一个礼物清单中正好在拿出来的k件礼物中,那么时间只需要1秒,如果不在那么就继续拿礼物出来,假设礼物清单在第m件,时间就会等于(m-已经送出去的礼物件数)*2+1;
用vis来标记礼物是否被拿出来。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; int a[MAXN]; int b[MAXN]; bool vis[MAXN]; int main(){ int T; cin>>T; while(T--){ memset(vis,0,sizeof(vis)); int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=m;i++){ cin>>b[i]; } ll ans=0LL; int flag=1; for(int i=1;i<=m;i++){ if(vis[b[i]]){ ans++;continue; } for(int j=flag;j<=n;j++){ vis[a[j]]=true; if(a[j]==b[i]){ flag=j; break; } } ans+=2LL*(flag-i)+1LL; } cout<<ans<<endl; } return 0; }
D - Santa’s Bot
概率题
需前置知识:快速幂,费马小定理求逆元。
附上大佬的题解https://www.cnblogs.com/pixel-Teee/p/12127496.html