AtCoder Beginner Contest 230
A AtCoder Quiz 3
大于42加一即可
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n , fa[N];
int main()
{
cin >> n;
cout << "AGC";
if( n >= 42 ) n ++;
printf("%03d\n", n);
}
B Triple Metre
通过前两个字符判断出起点,然后循环判断是否符合条件
#include<bits/stdc++.h>
using namespace std;
string s , f = "oxx";
int main()
{
cin >> s;
int i;
if( s.size() == 1 && ( s[0] == 'o' || s[0] == 'x' ) )
{
cout << "Yes\n";
return 0;
}
if( s[0] == 'o' && s[1] == 'x' ) i = 0;
else if( s[0] == 'x' && s[1] == 'x' ) i = 1;
else if( s[0] == 'x' && s[1] == 'o' ) i = 2;
else
{
cout << "No\n";
return 0;
}
for( auto it : s )
{
if( it == f[i] ) i ++ , i %= 3;
else
{
cout << "No\n";
return 0;
}
}
cout << "Yes\n";
return 0;
}
C X drawing
首先\((A,B)\)是一定被涂成黑色的,其他的点是\((A+k,B-k),(A+k,B+k)\)可知\(|\frac{(A+k)-A}{(B+k)-B}|=|\frac{(A+k)-A}{(B-k)-B}|=1\),所以这些点构成两条斜率为正负一的直线,结合样例易知直线和四个边界有四个交点,即图中所有与\((A,B)\)连线斜率为正负一的点都是黑色点
#include<bits/stdc++.h>
using namespace std;
long long n , a , b , p , q , r , s;
int main()
{
cin >> n >> a >> b >> p >> q >> r >> s;
for( long long i = p ; i <= q ; i ++ )
{
for( long long j = r ; j <= s ; j ++ )
{
if( abs( i - a ) == abs( j - b ) ) printf("#");
else printf(".");
}
printf("\n");
}
}
D Destroyer Takahashi
题目给定了一些线段、一个攻击的宽度。对于每个线段只要有一个点被破坏,就认为该线段被破坏。对于每次攻击,穿透力是无限的,意思就是说,在只要有任意线段的任意一个点在本次攻击的范围中,线段就会被摧毁。
我们将所有的线段按照右端点从小到大排序,每次找到一个没有被摧毁的线段,那么该线段的右端点就是本次攻击的起点,因为知道攻击范围可以很简单求出本次攻击的终点,那么所有右端点在本次攻击终点之前的线段都可以被摧毁
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n , m , cnt ;
bool vis[N];
vector< pair< int , int > > line;
int read()
{
int x = 0, ch = getchar();
while( ch < '0' || ch > '9' ) ch = getchar();
while( ch >= '0' && ch <= '9' ) x = ( x << 3 ) + ( x << 1 ) + ch - '0' , ch = getchar();
return x;
}
int main()
{
n = read() , m = read();
line.push_back( { 0 , 0 } );
for( int i = 1 , l , r ; i <= n ; i ++ )
{
l = read() , r = read() ;
line.push_back( { r , l } );
}
n = line.size() - 1;
sort( line.begin() + 1 , line.end() );
for( int i = 1 , r ; i <= n ; i ++ )
{
if( vis[i] ) continue;
cnt ++ , vis[i] = 1 , r = line[i].first + m - 1;
for( int j = i + 1 ; line[j].second <= r && j <= n ; j ++ )
vis[j] = 1 ;
}
cout << cnt << endl;
}