SMU Summer 2024 Contest Round 7
Buy an Integer
1.这题是二分答案,而不是公式拿来整除,以为是整除找了半天自己的错误,其实二分答案一发就能过。
#include <bits/stdc++.h> #define int long long #define endl '\n' using namespace std; typedef pair<int,int> pii; #define x first #define y second #define all(v) v.begin(),v.end() #define ull unsigned long long int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; int a,b,x; bool check(int mid) { int num=0; string s=to_string(mid); num=s.size(); if(a*mid+b*num<=x) return 1; return 0; } signed main() { ios::sync_with_stdio(0),cin.tie(0); cin>>a>>b>>x; int l=0,r=1e9; /* int ans=0; while(l<=r) { int mid=(l+r)>>1; if(check(mid)) { l=mid+1; ans=mid; } else r=mid-1; } cout<<ans;*/ while(l<r) { int mid=(l+r+1)>>1; if(check(mid)) l=mid; else r=mid-1; } cout<<l; //这题这两种二分写法都可以,建议学第一个模版 }
Make Equal With Mod
1.直接每个数对3取余,这样就只有0 1 2去判断,如果三个数都相同或者只有0 2即正确,其余情况都是错误的。
#include <bits/stdc++.h> using namespace std; #define int long long #define pii pair<int, int> #define all(v) v.begin() ,v.end() signed main(){ std::ios::sync_with_stdio(0); std::cin.tie(0); int t;cin>>t; while(t--) { int n;cin>>n; int fla1=0,fla2=0,fla0=0; vector<int>ve(n); for(int i=0;i<n;i++) { cin>>ve[i]; ve[i]%=3; if(ve[i]==1) fla1=1; if(ve[i]==2) fla2=1; if(ve[i]==0) fla0=1; } if((fla1&&!fla2&&!fla0 )||(!fla1&&!fla2&&fla0)||(!fla1&&fla2&&!fla0)||(fla2&&!fla1&&fla0)) { cout<<"YES"; }else cout<<"NO"; cout<<endl; } return 0; }
String Formation
1.这题其实就是卡翻转的时间,那么对其处理一下就好
2.每次遇到操作2时,检查一下cnt是奇数还是偶数,如果是偶数,说明其实没有翻转,那么原来怎么插入,我们就怎么插入,如果是奇数,说明翻转了,那么我们把原来要插到前面的插到后面,原来要插到后面的同理,最后循环结束再检查一下cnt是奇数还是偶数,若为奇数翻转一下即可。
#include <bits/stdc++.h> #define int long long #define endl '\n' using namespace std; typedef pair<int,int> pii; #define x first #define y second #define all(v) v.begin(),v.end() #define ull unsigned long long int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; int a,b,x; signed main() { ios::sync_with_stdio(0),cin.tie(0); string s;cin>>s; int n; cin>>n; int fla=0,cnt=0; while(n--) { int op; cin>>op; if(op==2) { int x; string c; cin>>x>>c; if((cnt%2==0&&x==1)||(cnt%2==1&&x==2))//没翻转按原来插,翻转了x==2才是插前面 { s=c+s; }else{ s+=c; } }else{ cnt++; } } if(cnt%2==1) reverse(all(s)); cout<<s; }
Game on Ranges
1.对于每一个
#include <bits/stdc++.h> #define int long long #define endl '\n' using namespace std; typedef pair<int,int> pii; #define x first #define y second #define all(v) v.begin(),v.end() #define ull unsigned long long int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; void solve() { int n; cin>>n; vector mark(n+1,vector<bool>(n+1)); vector<int>l(n),r(n); for(int i=0;i<n;i++) { cin>>l[i]>>r[i]; mark[l[i]][r[i]]=1; } for(int i=0;i<n;i++) { for(int j=l[i];j<=r[i];j++) { if((j==l[i] or mark[l[i]][j-1] )and( j==r[i] or mark[j+1][r[i]])) //这里一定要把j==l【i】和j==r【i】写在Mark的前面,不然就会报错 //因为写在前面判断正确以后,就不会判断后面的条件,如果是边界又判断了后面的条件就会报错 { cout<<l[i]<<" "<<r[i]<<" "<<j; cout<<endl; break; } } } cout<<endl; /* for (int i = 0; i < n; ++i) { for (int d = l[i]; d <= r[i]; ++d) { if ((d == l[i] or mark[l[i]][d - 1]) and (d == r[i] or mark[d + 1][r[i]])) { cout << l[i] << ' ' << r[i] << ' ' << d << '\n'; break; } } } */ } signed main() { ios::sync_with_stdio(0),cin.tie(0); int t=1;cin>>t; while(t--) solve(); }
D - Bouquet
1.在n个物品中分别选1-n种一共有2n-1种的方法,然后减掉不符合的n种选a种的数量和n种选b种的数量
2.考察卢卡斯定理的运用,即大组合数取模
3.并且注意一下负数取模的问题
/** - swj - * /> フ | _ _| /`ミ _x ノ / | / ヽ ? / ̄| | | | | ( ̄ヽ__ヽ_)_) \二つ **/ #include <bits/stdc++.h> #define int long long #define endl '\n' using namespace std; typedef pair<int,int> pii; #define x first #define y second #define all(v) v.begin(),v.end() #define ull unsigned long long int dx[]={0,1,0,-1}; int dy[]={1,0,-1,0}; //----卢卡斯定理-------------- #define mod 1000000007 int n,a,b; int qpow(int a,int n) //快速幂 { int res=1; while(n) { if(n&1) res=res*a%mod; a=a*a%mod; n>>=1; } return res; } int C(int n,int m) { if(n<m) return 0; if(m>n-m) m=n-m; int a=1,b=1; for(int i=0;i<m;i++){ a=(a*(n-i))%mod; b=(b*(i+1))%mod; } return a*qpow(b,mod-2)%mod; } int lucas(int n,int m) { if(m==0) return 1; return lucas(n/mod,m/mod)*C(n%mod,m%mod)%mod; } //-------------------------------------- signed main() { ios::sync_with_stdio(0),cin.tie(0); int t=1; //cin>>t; while(t--) { cin>>n>>a>>b; int ans=qpow(2,n)-1-lucas(n,a)-lucas(n,b); //注意负数取模的问题,不能直接(ans+mod)%mod,要一直加到大于0才取模 while(ans<0) ans+=mod; cout<<ans%mod; } }
posted on 2024-07-26 20:51 swj2529411658 阅读(10) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)