1 2 3 4

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;
}
posted @ 2021-03-23 08:06  snuonuo  阅读(39)  评论(0)    收藏  举报