3/7
A Legs
只要算出来最多多少牲口就行,先除4再看有无剩余,有剩余++就行
void solve(){
int a;
cin>>a;
int ans ;
// cout<<a<<endl;
if(a%4==0){
ans = a/4;
}else{
ans = a/4;
ans++;
}
cout<<ans<<endl;
}
B Scale
给你一个只有01的矩阵,缩小k倍,这里踩的坑是输入时是一连串数字没有空格,要用字符串转存
但解法很简单,只需i+=k,j+=k就行了
#include <iostream>
using namespace std;
int mp[1001][1001];
int main()
{
int t;
cin>>t;
for(int xx = 1;xx<=t;xx++){
int n,k;
cin>>n>>k;
for(int i = 1;i<=n;i++){
string a;
cin>>a;
for(int j = 1,p = 0;j<=n;j++,p++){
mp[i][j] = a[p]-'0';
}
}
// for(int i = 1;i<=n;i++){
// for(int j = 1;j<=n;j++) cout<<mp[i][j];
// cout<<endl;
// }
for(int i = 1;i<=n;i+=k){
for(int j = 1;j<=n;j+=k){
cout<<mp[i][j];
}
cout<<endl;
}
}
return 0;
}
C Sort
给你两个字符串a,b,每次询问给你区间l,r,问你最少多少次操作(每次操作都可以将一个字母变成另一个字母)
思路 :注意到时限是5s ,可以考虑用前缀和来存储每个位置之前的某个字母的个数
赛时踩的坑是把递推数组写进了查询里,我真shabi
int acnt[30][200001];
int bcnt[30][200001];
void solve(){
int n,q;
cin>>n>>q;
string a,b;
cin>>a>>b;
for(int i = 1;i<=26;i++){
for(int j = 1;j<=n;j++){
if(a[j-1]-'a'+1==i) acnt[i][j] = acnt[i][j-1]+1;
else acnt[i][j] = acnt[i][j-1];
}
}
for(int i = 1;i<=26;i++){
for(int j = 1;j<=n;j++){
if(b[j-1]-'a'+1==i) bcnt[i][j] = bcnt[i][j-1]+1;
else bcnt[i][j] = bcnt[i][j-1];
}
}
while(q--){
int l,r;
cin>>l>>r;
ll ans = 0;
for(int i = 1;i<=26;i++){
ans+=abs(bcnt[i][r]-bcnt[i][l-1]-acnt[i][r]+acnt[i][l-1]);
}
if(ans%2==0){
ans/=2;
}else{
ans/=2;
ans++;
}
cout<<ans<<endl;
}
}
D Fun
给定两个整数 n 和 x ,求 ab+ac+bc≤n 和 a+b+c≤x 的个正整数的三元组( a,b,c)的个数。
注意顺序问题(例如 ( 1,1,2 ) 和 ( 1,2,1 ) 被视为不同), a , b , c 必须严格大于 0 。
思路: 发现一定有ab<=n,又可以范围确定c的个数,因为是算总数,所以不用算出c具体是什么,
所以有代码枚举a然后枚举b,使用a*b<=n可以控在nlogn
void solve(){
int n,k;
cin>>n>>k;
ll ans = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; i * j <= n; j++) {
ll t1 = i * j, t2 = i + j;
if ((n - t1) / t2 > 0 && k - t2 > 0) ans += min((n - t1) / t2, k - t2);
}
cout<<ans<<endl;
}