赞
踩
#include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; int n; string s; string tmp="DFS"; string tt="dfs"; void solve() { cin>>n; cin>>s; int idx=0; for(int i=0;i<n;i++){ if(s[i]==tmp[idx]) idx++; } int pos=0; for(int i=0;i<n;i++){ if(s[i]==tt[pos]) pos++; } if(idx==3) cout<<1<<' '; else cout<<0<<' '; if(pos==3) cout<<1<<endl; else cout<<0<<endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; cin>>t; while(t--) { solve(); } return 0; }
左半边有没有着火点,右半边有没有着火点,(2,0)有没有着火点
左半边有没有被堵死,右半边有没有被堵死
可以用set存下所有位置,然后对于第一行的(1,y),看(2,y-1),(2,y),(2,y+1)有没有着火点,以此判断左半边和右半边有没有被堵死
#include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; typedef pair<int,int>PII; int n; int dy[3]={-1,0,1}; void solve() { cin>>n; bool left=false,right=false,mid=false;//左半边有没有着火点,右半边有没有着火点,(2,0)有没有着火点 bool leftdusi=false,rightdusi=false;//左半边有没有被堵死,右半边有没有被堵死 set<PII>s1,s2;//s1存放左半边的着火点坐标,s2存放右半边的着火点坐标 for(int i=0;i<n;i++){ int r,c; cin>>r>>c; if(c<0){ s1.insert({r,c}); left=true; } else if(c==0){ s1.insert({r,c}); s2.insert({r,c}); mid=true; } else{ s2.insert({r,c}); right=true; } } if(n==0){ cout<<3<<endl; return; } for(auto v:s1){//枚举左半边的着火点 int x=v.first,y=v.second; if(x==2) continue; for(int i=0;i<3;i++){ int ty=y+dy[i]; if(ty<-1e9) continue; if(s1.count({2,ty})){ leftdusi=true; } } if(leftdusi) break; } for(auto v:s2){//枚举右半边的着火点 int x=v.first,y=v.second; if(x==2) continue; for(int i=0;i<3;i++){ int ty=y+dy[i]; if(ty>1e9) continue; if(s2.count({2,ty})){ rightdusi=true; } } if(rightdusi) break; } // cout<<leftdusi<<' '<<rightdusi<<endl; // cout<<left<<' '<<right<<' '<<mid<<endl; if(leftdusi&&rightdusi) cout<<0<<endl;//左右两边都被堵死 else if(leftdusi){//只有左边被堵死 if(right) cout<<1<<endl;//右边没被堵死,但有至少一个着火点 else if(mid) cout<<1<<endl; else cout<<2<<endl; } else if(rightdusi){//只有右边被堵死 if(left) cout<<1<<endl; else if(mid) cout<<1<<endl; else cout<<2<<endl; } else{//如果两边都没堵死 if(s1.count({1,-1})&&s2.count({1,1})) cout<<1<<endl; else if(s1.count({1,-1})||s2.count({1,1})) cout<<2<<endl; else if((left&&right)||mid) cout<<2<<endl; else cout<<3<<endl; } } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; cin>>t; while(t--) { solve(); } return 0; }
#include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; const int N=1e5+10; int t[N]; int tt[N]; int n,q,tc; void solve() { cin>>n>>q>>tc; int sum=0; for(int i=1;i<=n;i++) cin>>t[i]; sort(t+1,t+1+n); for(int i=1;i<=n;i++){ sum+=t[i]; tt[i]=sum; } // for(int i=1;i<=n;i++) cout<<tt[i]<<' '; // cout<<endl; while(q--){ int m; cin>>m; m/=tc; if(m>=n) m=n; cout<<tt[n-m]+tc<<endl; } } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; // cin>>t; while(t--) { solve(); } return 0; }
数据比较小,直接暴力,dfs
#include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; typedef pair<int,int>PII; const int N=15; int a[N]; int n,m; int res; int score; vector<PII>ans; void dfs(int u){ if(u==(int)ans.size()){ vector<int>c; // for(int i=1;i<=n;i++) cout<<a[i]<<' '; // cout<<endl; for(int i=1;i<=n;i++) c.push_back(a[i]); // for(int i=0;i<n;i++) cout<<c[i]<<' '; // cout<<endl; sort(c.begin(),c.end()); reverse(c.begin(),c.end()); // for(int i=0;i<n;i++) cout<<c[i]<<' '; // cout<<endl; // cout<<score<<endl; for(int i=0;i<n;i++){ if(score==c[i]){ res=min(res,i+1); break; } } return; } int x=ans[u].first,y=ans[u].second; int tmp=a[x]; a[x]+=3; dfs(u+1); a[x]=tmp; tmp=a[y]; a[y]+=3; dfs(u+1); a[y]=tmp; int tmp1=a[x],tmp2=a[y]; a[x]++; a[y]++; dfs(u+1); a[x]=tmp1; a[y]=tmp2; } void solve() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; score=a[1]; ans.clear(); for(int i=0;i<m;i++){ int x,y; cin>>x>>y; if(x==1||y==1) a[1]+=3,score+=3; else ans.push_back({x,y}); } // for(int i=1;i<=n;i++) cout<<a[i]<<' '; // cout<<endl; res=2e9; dfs(0); cout<<res<<endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; cin>>t; while(t--) { solve(); } return 0; }
#include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; typedef pair<int,int>PII; int n,m; void solve() { cin>>n>>m; vector<PII>ans; int sum=0; for(int i=0;i<n;i++){ int a,b; cin>>a>>b; sum+=b; ans.push_back({a,b}); } sort(ans.begin(),ans.end()); reverse(ans.begin(),ans.end()); for(int i=0;i<n;i++){ if(ans[i].first-sum<=m){ cout<<m+sum<<endl; return; } sum-=ans[i].second; } cout<<m<<endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; cin>>t; while(t--) { solve(); } return 0; }
或上的和要小于等于m
假设m的二进制为100101101
首先,如果最后或起来的值刚好为m,肯定是合法的,如果m或上一个数还是等于m的话,那么就可以或上
然后,考虑最后或起来是比m小的值,那么肯定需要把某位1变成0,这样才能变小,但是想要能或上的数很多,那么1肯定要多,所以把该位后面的位全变成1,这样仍然是小于m的,是合法的,即为m1,如果m1或上一个数还是等于m1的话,那么就可以或上
同理,遍历每一个1,按照以上操作,都可以得到一个m1,是小于m的,是合法的
在这么多种情况中,取最优的就行
#include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; const int N=1e5+10; int v[N],w[N]; int n,m; void solve() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>v[i]>>w[i]; int ans=0; int sum=0; for(int i=1;i<=n;i++){ if((m|w[i])==m) sum+=v[i]; } ans=max(ans,sum); int x=0; for(int i=60;i>=0;i--){ if((1ll<<i)&m){//如果m的第i位为1,那么m1为第i位为0,低位全部为1 int m1=x|((1ll<<i)-1); sum=0; for(int i=1;i<=n;i++){ if((m1|w[i])==m1) sum+=v[i]; } ans=max(ans,sum); x|=(1ll<<i); } } cout<<ans<<endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; cin>>t; while(t--) { solve(); } return 0; }
第一个人的圆心坐标均匀分布,第二个人圆心坐标会因为r而重置,两者圆心坐标分布概率不一样
由于n为1e5,大数据,都是随机的,模拟,可以利用关于圆心坐标的指标将两者区分开来
#include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; int random(int l,int r){ return (long long)rand()*rand()%(r-l+1)+l; } int n; void solve() { //bit-noob,第一个人,重新生成r srand((unsigned)time(NULL));//加上这个才能真正产生随机数 int n=100000; int sum=0; for(int i=0;i<n;i++){ int x,y,r; x=random(-99,99); y=random(-99,99); do{ r=random(1,100); }while(x+r>100||x-r<-100||y+r>100||x-r<-100); sum+=abs(x)+abs(y); } cout<<sum<<endl; //9984284 //9998881 //9997845 } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; // cin>>t; while(t--) { solve(); } return 0; }
#include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; int random(int l,int r){ return (long long)rand()*rand()%(r-l+1)+l; } int n; void solve() { //buaa-noob,第二个人,重新生成x,y,r srand((unsigned)time(NULL));//加上这个才能真正产生随机数 int n=100000; int sum=0; for(int i=0;i<n;i++){ int x,y,r; do{ x=random(-99,99); y=random(-99,99); r=random(1,100); }while(x+r>100||x-r<-100||y+r>100||x-r<-100); sum+=abs(x)+abs(y); } cout<<sum<<endl; //8158289 //8150800 //8132724 } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; // cin>>t; while(t--) { solve(); } return 0; }
AC代码:
#include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; int n; void solve() { cin>>n; int sum=0; for(int i=0;i<n;i++){ int x,y,r; cin>>x>>y>>r; sum+=abs(x)+abs(y); } if(sum>9900000) cout<<"bit-noob"<<endl; else cout<<"buaa-noob"<<endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; // cin>>t; while(t--) { solve(); } return 0; }
#include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; int c,d,h,w; void solve() { cin>>c>>d>>h>>w; cout<<3*w*c<<endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; cin>>t; while(t--) { solve(); } return 0; }
#include<bits/stdc++.h> #define endl '\n' #define int long long using namespace std; int n; void solve() { cin>>n; if(n%6==0) cout<<n/6<<endl; else cout<<n/6*2<<endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t=1; cin>>t; while(t--) { solve(); } return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。