Dashboard - Codeforces Round 928 (Div. 4) - Codeforces
第一次参加CF,最后一道题连题都没读,下次不会就跳,菜是原罪
A:找字符串中A,B数量,遍历一下最后比较即可
B:判断是三角形还是正方形,题目表示除了正方形就是三角形,所以直接判断是不是正方形,用ans数组记录每一行 1 的个数,然后从大到小排序,如果有ans[1] 和 ans[2]相等,就是正方形,不然就是三角形
void solve(){ int n;cin>>n; memset(a,0,sizeof(a)); memset(ans,0,sizeof(ans)); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>a[i][j]; if(a[i][j]-'0'==1) ans[i]++; } } sort(ans+1,ans+1+n,cmp); if(ans[1]==ans[2]) cout<<"SQUARE"<<endl; else cout<<"TRIANGLE"<<endl; }
C:计算数位和,但是直接算的话会超时,所以其实考察的是前缀和,提前把200000个数每个数的数位和计算并存起来,直接用就可以了
int a[maxn],b[maxn]; int f(int x){ int ans=0; while(x>0){ ans+=x%10; x/=10; } return ans; } void solve(){ int n;cin>>n; cout<<b[n]<<endl; } signed main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); for(int i=1;i<=200000;i++){ a[i]=f(i); b[i]=b[i-1]+a[i]; } int t;cin>>t; while(t--){ solve(); } return 0; }
D:判断是否存在两个数二进制的每一位相不相同,注意这里需要判断31位,如果输入的n个数中存在两个数的每一位都不同,就在一个组,不然那个数一个人一组,可以得出存在的这两种数异或为0。
思路是用map来记录,如果跟这个数异或为0的数没出现过,先让它自己一个组,把他的另一半(即异或为0的数)也放进来,这样下次碰见他的另一半的时候,发现关于他已经有一个组了,直接把他从组里删除就可以了
void solve(){ int n;cin>>n; map<ll,int> mp; int ans=0; for(int i=1;i<=n;i++){ int x;cin>>x; if(!mp[x]){ ans++; mp[((1<<31)-1)^x]++; }else mp[x]--; } cout<<ans<<endl; }
E:放牌的问题,根据样例的解释模拟一下,发现跟分治有点沾边,下面是一个推导:
当n=7:
f(1,2,3,4,5,6,7)
=f(2,4,6) 相当于 ( f(1,2,3) )*2
=f(2) 相当于 ( f(1) )*2
所以相当于每次删去奇数,剩下的偶数 / 2 变成奇数
当n=18:
f([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18], 15)
=f([2,4,6,8,10,12,14,16,18], 6) 删掉:(18+1)/2个数
=f([1,2,3,4,5,6,7,8,9], 6)*2
=f([2,4,6,8], 1)*2 删:(9+1)/2个数
=f([1,2,3,4], 1)*4
void solve(){ int n,k;cin>>n>>k; int cnt=0; //轮次 while(k>(n+1)/2){ //k大于奇数的个数 int num=(n+1)/2; //奇数的个数 k-=num; //奇数在第一轮已经放下,所以减去放下的数 n/=2; //剩下元素/2变成奇数 cnt++; //轮次+1 } cout<<((2*k-1)<<cnt)<<endl; }
继续努力吧,争取下次Div4全部写完
标签:奇数,int,个数,Codeforces,928,solve,ans,Div From: https://www.cnblogs.com/accbulb/p/18023223