20210322AtCoder刷题
AGC038 A - 01 Matrix
-
题意:
构造一个n*m的0-1矩阵,使得每一行0,1个数的最小值为a,每一列0,1个数的最小是为b -
思路:
画图最终观察出一个可行解:
前m-b行的前a列填充1,后n-a列填充0;后b行的前a列填充0,后b列填充1 -
Code:
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
#define inf 1e9
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline int read()
{
int x=0,w=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
return w==1?x:-x;
}
int n,m,p,q;
int main()
{
//freopen("t1.in","r",stdin);
n=read();m=read();p=read();q=read();
if(p>m/2 ||q>n/2) printf("-1\n");
else{
rep(i,1,n-q)
{
rep(j,1,p) printf("1");
rep(j,1,m-p) printf("0");
puts("");
}
rep(i,1,q)
{
rep(j,1,p) printf("0");
rep(j,1,m-p) printf("1");
puts("");
}
}
return 0;
}
AGC038 A - Triangle
-
题意:
给定三角形面积的两倍S(<1e18),构造出三个合法的整数顶点的坐标X1,Y1,X2,Y2,X3,Y3(<1e9) -
思路:
首先(X1=0,Y1=0);
其次 S = X2 * Y3 - X3 * Y4;
于是:令Y3=1e9,X3=1,X2=ceil(S/1e9),Y4=X2*Y3-S -
Code:
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
const long long inf=1e9;
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline ll read()
{
ll x=0,w=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
return w==1?x:-x;
}
ll s;
int main()
{
//freopen("t1.in","r",stdin);
s=read();
ll a,b,c,d;
printf("0 0 ");
if(s%inf==0) a=s/inf;else a=s/inf+1;
b=1;
d=inf;
c=a*d-s;
printf("%lld %lld %lld %lld\n",a,b,c,d);
return 0;
}
AGC031 A - Colorful Subsequence
-
题意:
给定长度为n的字符序列S,求字母互不相同的子序列数量(mod 1e9+7) -
思路:
统计每个字母的个数:答案为:(cnt_a + 1) * (cnt_b + 1) * (...) * (cnt_z + 1) -1
记得最后-1减掉一个都不选的情况;
一开始在考虑每个字符出现的位置,想了好久,其实每个字符的个数就是不同的字符的位置了 -
Code:
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
const int mod=1e9+7;
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
inline int read()
{
int x=0,w=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') w=-1; c=getchar();}
while(c<='9'&&c>='0') {x=(x<<1)+(x<<3)+c-'0'; c=getchar();}
return w==1?x:-x;
}
int n,a[30];
char c;
int main()
{
//freopen("t1.in","r",stdin);
n=read();
rep(i,0,n-1) c=getchar(),a[c-'a']++;
ll ans=1;
rep(i,0,25) ans=(ans*(a[i]+1))%mod;
printf("%lld\n",ans-1);
return 0;
}
AGC031 A - Poisonous Cookies
-
题意:
a个不好吃的解药饼干,b个好吃的解药饼干,c个好吃的毒药饼干.毒药饼干两吃两个就会死,吃过一个毒药饼干可以被解药饼干解毒.问:最多能吃上多少个好吃的饼干. -
思路:
做其他题都要写好久,随便找了道简单题2min就过了:
a+b+1个位置插入c个毒药饼干要求c个毒药饼干不能相邻;
c<=a+b+1:b+c
c>a+b+1:a+b+1+b -
Code:
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
printf("%d\n", min(a + b + 1, c) + b);
return 0;
}

浙公网安备 33010602011771号