Codeforces Round #692 (Div. 2, based on Technocup 2021 Elimination Round 3)
B
题意
给你一个数,找到一个可以整除某个数任意一位的数
分析
1 2 3 4 5 6 7 8 9的lcm是2550,说明最大就是2550暴力即可
代码
#include
#define ll long long
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
ll n,m;
cin>>n;
m=n;
int flag=0;
while(!flag)
{
while(n)
{
int x=n%10;
if(x!=0)
{
if(m%x!=0)
{
m++;
n=m;
break;
}
}
n/=10;
}
if(n==0)flag++;
}
cout<
C
题意
给你一个棋盘,一开始每个车不能在同一行同一列,然后最后让你把他们移动对角线
分析
如果是一个环就res++
代码
/*made in mrd*/
#include
using namespace std;
const int N=2e5+10;
const int M=5e3+10;
#define int long long
#define mem(a,b) memset(a,b,sizeof a)
#define fi first
#define se second
#define cout1(x) cout<
int f[N];
int find(int x)
{
if(x!=f[x]) f[x]=find(f[x]);
return f[x];
}
signed main() {
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int res=m,cnt=0;
for(int i=1;i<=n;i++) f[i]=i;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
if(x==y) res--;
else if(find(x)==find(y)) cnt++;
else {
f[find(x)]=y;
}
}
cout< .│? /│ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │
* ├─────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ E││
* │ Ctrl│ Win│ Alt│ Space │ Alt│ Win│Menu│Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │←─┘│
* └─────┴────┴────┴───────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
*/
D
题意
?可以变成1或0,01子序列可以获得x,10子序列可以获得y求最少可以多少
分析
代码
#include
using namespace std;
typedef long long LL;
const int N=1e5+10;
char str[N];
LL x,y;
int st[N][3],ed[N][3];//记录每个位置之前0,1,'?'的数量
vectorg;//存下每个问号的位置
int main()
{
scanf("%s",str+1);
scanf("%lld%lld",&x,&y);
int len=strlen(str+1);
for(int i=1;i<=len;i++)
{//求前缀
st[i][0]=st[i-1][0];
st[i][1]=st[i-1][1];
st[i][2]=st[i-1][2];
if(str[i]=='0') st[i][0]++;
else if(str[i]=='1') st[i][1]++;
else
{
st[i][2]++;
g.push_back(i);
}
}
for(int i=len;i>=1;i--)
{//求后缀
ed[i][0]=ed[i+1][0];
ed[i][1]=ed[i+1][1];
ed[i][2]=ed[i+1][2];
if(str[i]=='0') ed[i][0]++;
else if(str[i]=='1') ed[i][1]++;
else ed[i][2]++;
}
LL num0=0,num1=0;//记录前缀中0和1的数量(先把'?'都先看成是1)
LL ans=0;
for(int i=1;i<=len;i++)
{
if(str[i]=='0')
{
ans=ans+num1*y;
num0++;
}
else
{
ans=ans+num0*x;
num1++;
}
}
LL res=ans;
if(x=0;i--)
{//从后往前遍历问号的位置,并把它变成0
int idx=g[i];
res=res-st[idx-1][0]*x-(ed[idx+1][0]+ed[idx+1][2])*y;
res=res+(st[idx-1][1]+st[idx-1][2])*y+ed[idx+1][1]*x;
ans=min(res,ans);
}
}
printf("%lld\n",ans);
//system("pause");
return 0;
}