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)如下:1.png

题解:这篇(戳)写得很易懂,思维题,要联想到函数图像

#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的子字符串。我们至少需要更改多少个字符?

知识点未学(略)

ABC196官方题解

posted @ 2021-03-22 21:38  wuwendongxi  阅读(102)  评论(0编辑  收藏  举报