ABC196
ABC196
- A
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a,b,c,d; cin>>a>>b>>c>>d;
cout<<(b-c)<<endl;
return 0;
}
- B
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[10003];
int main()
{
cin>>(a+1);
int len=strlen(a+1);
for(int i=1;i<=len;++i)
{
if(a[i]=='.') break;
cout<<a[i];
}
return 0;
}
- C
比赛时莫名其妙爆了5个点
题意:给定的是一个整数N。有多少个介于1和N(含)之间的整数x满足以下条件?x的十进制表示法(不带前导零)有偶数位数,其上半部分和下半部分作为字符串相等。
#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
signed main()
{
long long n;cin>>n;
for(int i=1,tmp;i;++i)
{
if(i==1) tmp=11;
if(i==10) tmp=101;
if(i==100) tmp=1001;
if(i==1000) tmp=10001;
if(i==10000) tmp=100001;
if(i==100000) tmp=1000001;
if(i*tmp>n) return cout<<i-1<<'\n',0;
}
return 0;
}
- D
题意:一个长方形的房间,长H米,宽W米,我们将用A个2×1的长方形和B个1×1点正方形垫子来覆盖,保证2A+B=HW,且H×W<=16,求摆放方式个数(旋转、对称后相同算不同种)
题解:搜索,从左上角的格子开始,执行DFS,尝试放置一个正方形的榻榻米垫子,一个从左边或下面伸出的长方形榻榻米垫子,然后我们可以穷尽地搜索所有覆盖的方法;看到16想到状压。
#include <iostream>
#include <cstdio>
using namespace std;
int h,w,A,B,ans;
void dfs(int i,int bit,int a,int b)//已摆放格子个数,当前状态,A,B剩余个数
{
if(i==h*w) return ++ans,void();
if(bit&1<<i) dfs(i+1,bit,a,b);//已摆放此格
if(b) dfs(i+1,bit|1<<i,a,b-1);//放1*1
if(a){
if(i%w!=w-1&&~bit&1<<i+1) dfs(i+2,bit|1<<i|1<<i+1,a-1,b);//横放
if(i+w<=h*w&&~bit&1<<i+w) dfs(i+1,bit|1<<i|1<<i+w,a-1,b);//竖放
}
}
int main()
{
cin>>h>>w>>A>>B; dfs(0,0,A,B);
cout<<ans<<'\n';
return 0;
}
- E
给定整数序列A=(a1,a2,…,an),T=(t1,t2,…,tn)和X=(x1,x2,…,xq)。让我们定义N个函数f1(X),f2(X),…,fn(X)如下:
题解:这篇(戳)写得很易懂,思维题,要联想到函数图像
#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
const int inf=2e18;
int clamp(int x,int mn,int mx){
if(x>mx) return mx;
if(x<mn) return mn;
return x;
}
signed main()
{
int n,low=-inf,high=inf,bias=0; scanf("%lld",&n);
for(int i=1,a,t;i<=n;++i)
{
scanf("%lld%lld",&a,&t);
if(t==1) low+=a,high+=a,bias+=a;
else if(t==2) low=max(low,a),high=max(high,a);
else low=min(low,a),high=min(high,a);
}
int q,x; scanf("%lld",&q);
while(q--) scanf("%lld",&x),cout<<clamp(x+bias,low,high)<<'\n';
return 0;
}
- F
题意:给定由0和1组成的字符串S和T。我们将更改T中的一些字符,使T成为S的子字符串。我们至少需要更改多少个字符?
知识点未学(略)