思路分析
直接模拟即可 ## AC代码
#include<bits/stdc++.h> using namespace std; using ll=long long; const int MAXN=1e6+10; void solve(){ int a=0; string s; cin>>s; for(int i=0;i<s.length();i++){ if(s[i]=='A')a++; } if(a>5-a)cout<<"A\n"; else cout<<"B\n"; } int main(){ int t; cin>>t; while(t--){ solve(); } }
|
思路分析
我的思路是:当统计每一行1的个数,当第\(i\)与第\(i-1\)行中统计到的1的个数(前提是这两行中1的个数不为0)不同时,就是三角形,否则是正方形。
一开始的时候WA了一次,就是没考虑到第\(i\)行与第\(i+1\)行中1的个数都得不为0 ## WA代码
#include<bits/stdc++.h> using namespace std; using ll=long long; const int MAXN=12; void solve(){ int n=0,flag=0; vector<int> cnt_1(MAXN); string s; cin>>n; for(int i=1;i<=n;i++){ cin>>s; for(int j=0;j<n;j++){ if(s[j]=='1')cnt_1[i]++; } if(i>=2&&cnt_1[i-1]){ if(cnt_1[i-1]!=cnt_1[i]){ flag=1; } } } if(flag)cout<<"TRIANGLE\n"; else cout<<"SQUARE\n"; } int main(){ int t; cin>>t; while(t--){ solve(); } }
|
AC代码
#include<bits/stdc++.h> using namespace std; using ll=long long; const int MAXN=12; void solve(){ int n=0,flag=0; vector<int> cnt_1(MAXN); string s; cin>>n; for(int i=1;i<=n;i++){ cin>>s; for(int j=0;j<n;j++){ if(s[j]=='1')cnt_1[i]++; } if(i>=2&&cnt_1[i-1]&&cnt_1[i]){ if(cnt_1[i-1]!=cnt_1[i]){ flag=1; } } } if(flag)cout<<"TRIANGLE\n"; else cout<<"SQUARE\n"; } int main(){ int t; cin>>t; while(t--){ solve(); } }
|
刚刚写博客的时候想到可以改进一下,如果\(flag==1\)了,那么后面的输入其实都是没有意义的,也就不需要统计和判断了,修改如下:
#include<bits/stdc++.h> using namespace std; using ll=long long; const int MAXN=12; void solve(){ int n=0,flag=0; vector<int> cnt_1(MAXN); string s; cin>>n; for(int i=1;i<=n;i++){ cin>>s; for(int j=0;j<n&&!flag;j++){ if(s[j]=='1')cnt_1[i]++; } if(i>=2&&cnt_1[i-1]&&cnt_1[i]&&!flag){ if(cnt_1[i-1]!=cnt_1[i]){ flag=1; } } } if(flag)cout<<"TRIANGLE\n"; else cout<<"SQUARE\n"; } int main(){ int t; cin>>t; while(t--){ solve(); } }
|
思路分析
其实是一个见过很多次的操作了qwq,先离线处理计算(没错,就是你想的暴力计算\(qwq\))出所有在数据范围内的答案,然后用一个数组将其存下即可。这样可以做到\(O(1)询问\),预处理时间是\(O(MAXN)\),总的时间复杂度为\(O(MAXN+n)\) ## AC代码 具体细节看看代码
#include<bits/stdc++.h> using namespace std; using ll=long long; const int MAXN=2e5+10; vector<int> ans(MAXN); int cal(int x){ int tot=0; while(x){ tot+=(x%10); x/=10; } return tot; } void solve(){ int n; cin>>n; cout<<ans[n]<<"\n"; } int main(){ ans[0]=0; for(int i=1;i<MAXN;i++){ ans[i]=ans[i-1]+cal(i); } int t; cin>>t; while(t--){ solve(); } }
|
思路分析
题目的意思:将给的数字分成若干组,同一组中的若干个数字之间,他们的二进制形式的每一位必须都是不同的,求最小组数
我们可以先分析同一组中的数字有什么特点:
那么我们可以根据这个性质,来求解这道题了,具体还得看代码。 ## AC代码
#include<bits/stdc++.h> using namespace std; using ll=long long; const int MAXN=2e5+10; void solve(){ int ans=0; int n;cin>>n; map<ll,int> book; for(int i=1;i<=n;i++){ int x;cin>>x; if(book[((1<<31)-1)^x]){ book[((1<<31)-1)^x]--; ans++; } else book[x]++; } for(auto x:book){ ans+=x.second; } cout<<ans<<"\n"; } int main(){ int t; cin>>t; while(t--){ solve(); } }
|
思路分析
可以先模拟一下题目说的流程: ## AC代码
#include<bits/stdc++.h> using namespace std; using ll=long long; const int MAXN=2e5+10; void solve(){ int n,k;cin>>n>>k; int cnt=0; while(k>(n+1)/2){ int tot=(n+1)/2; k-=tot; n/=2; cnt++; } cout<<((2*k-1)<<cnt)<<"\n"; } int main(){ ios::sync_with_stdio(0); int t; cin>>t; while(t--){ solve(); } }
|