2020년 04월 05일 - 개인전
A - The number of positions
제목: 제목의 뜻은 비교적 간단하다. 간단하게 설명하자면 한 어린이가 줄을 서 있다. 그의 앞에는 적어도 a명이 있고 뒤에는 최대 b명이 있다. 이 어린이가 있을 수 있는 위치가 몇 개인지 구하고 가능한 수량을 출력한다.
문제풀이: 간단한 시뮬레이션을 한 번 하면 된다.
코드:
1 #include
2 #include<set>
3 #include
4 #include
5 #define ll long long
6 using namespace std;
7 int main(){
8 int n,a,b;
9 cin>>n>>a>>b;
10 int ans=0;
11 for(int i=a+1;i<=n;i++){
12 if((n-i)<=b){
13 ans++;
14 }
15 }
16 cout<endl;
17 return 0;
18
19 }
B - Permutations
제목: 이 문제의 뜻은 비교적 간단하다. 제목은 n개의 길이가 k인 숫자를 주고 배열 조합을 요구한다. 여기서 주의해야 할 것은 모든 숫자가 배열 조합을 하는 규칙이 같다는 것이다.그중의 최대치에서 최소치의 차이를 최소화해 달라고 하세요.
문제풀이: 이 문제에는 많은 해법이 있다. 예를 들어 DFS를 이용하여 모든 배열 종류를 구하고 각 배열의 최소치를 기록하며 마지막으로 최소치를 구하면 된다. 그리고 간편한 방법은 다음과 같다.permutation(a, a + n) 함수의 역할은 길이가 n인 수조 a의 모든 배열의 진상황을 구하는 것이다. 이런 것은 DFS보다 훨씬 간편하다. 그 다음에 각 배열 방식의 최값을 구하고 차등을 구하면 된다.
1 #include
2 #include
3 #include
4 #include
5 using namespace std;
6 const int nk_max = 44;
7 const int INF = 0x3fffffff;
8 int n, k;
9 char number[nk_max][nk_max];
10 int bit[nk_max], sum, num_max, num_min, ans;
11 int main() {
12 while(~scanf("%d %d", & n, & k)) {
13 for(int i = 0; i < n; i ++){
14 scanf("%s", number[i]);//
15 }
16 for(int i = 0; i < k; i ++){
17 bit[i] = i;
18 // cout<
19 }
20 ans = INF;//
21 do { //
22 num_max = 0, num_min = INF;
23 for(int i = 0; i < n; i ++) {// n
24 sum = 0;
25 for(int j = 0; j < k; j ++){// k
26 sum = sum * 10 + (number[i][bit[j]] - '0');
27 }// int
28 num_max = max(num_max, sum);
29 num_min = min(num_min, sum);
30 }
31 ans = min(ans, num_max - num_min);//
32 } while(next_permutation(bit, bit + k));//
33 printf("%d
", ans);
34 }
35 return 0;
36 }
D - cAPS lOCK
제목: 이 문제도 간단한 제목이다. 주로 그 변화의 규칙을 똑똑히 보아야 한다. 단어가 모두 대문자로 되어 있을 때 모든 자모를 소문자로 바꾼다.단어의 첫 번째 자모가 소문자일 때, 뒤의 자모는 모두 대문자로 하고, 첫 번째 자모는 대문자로 바꾸고, 뒤의 자모는 소문자로 바꾼다.나머지 다른 형식은 바꾸지 말고 이 문제에서 세부 사항에 주의해야 한다.
문제풀이: 시뮬레이션, 각 상황을 배제하면 됩니다.
코드
법1:
1 #include
2 #include<set>
3 #include
4 #include
5 #define ll long long
6 using namespace std;
7 int main() {
8 string ptr;
9 cin>>ptr;
10 int an=0,f=0;
11 for(int i=1;i){
12 if(ptr[i]>='A'&&ptr[i]<='Z'){//
13 f++;
14 }else if(ptr[i]>='a'&&ptr[i]<='z'){//
15 an++;
16 }
17 }
18 if(an==0&&f!=0||ptr.length()==1){
19 if(ptr[0]>='a'&&ptr[0]<='z'){
20 ptr[0] = toupper(ptr[0]);//
21 }else if(ptr[0]>='A'&&ptr[0]<='Z'){
22 ptr[0] = tolower(ptr[0]);//
23 }
24 for(int i=1;i){
25 ptr[i] = tolower(ptr[i]);//
26 }
27 }
28 cout<<ptr;
29 return 0;
30
31 }
법2
1 #include
2 #include
3 #include
4 #define ll long long
5 using namespace std;
6 int app1(string ptr){
7 for(int i=0;i){
8 if(ptr[i]>='a'&&ptr[i]<='z'){
9 return 0;
10 }
11 }
12 return 1;
13 }
14 int app2(string ptr){
15 for(int i=1;i){
16 if(ptr[i]>='a'&&ptr[i]<='z'){
17 return 0;
18 }
19 }
20 return ptr[0]>='a'&&ptr[0]<='z';
21 }
22 int main() {
23 string ptr;
24 cin>>ptr;
25 if(ptr.length()==1) {// 1
26 if(ptr[0]>='A'&&ptr[0]<='Z'){//
27 ptr[0]=tolower(ptr[0]);
28 }else{
29 ptr[0]=toupper(ptr[0]);//
30 }
31 }else{// 1
32 int f1=app1(ptr);
33 int f2=app2(ptr);
34 if(f1||f2){//
35 for(int i=0;i){
36 if(i==0){//
37 if(ptr[i]>='A'&&ptr[i]<='Z'){
38 ptr[i]=tolower(ptr[i]);//
39 }else{
40 ptr[i]=toupper(ptr[i]);//
41 }
42 }else{
43 for(int i=1;i){
44 ptr[i]=tolower(ptr[i]);
45 }
46 }
47 }
48 }
49 }
50 cout<<ptr;
51 return 0;
52 }
E - Opposites Attract
제목: 대략적인 뜻은 너에게 한 줄의 수를 주는 것이다. 이 한 줄의 수 중 몇 개의 대수가 0이 될 수 있는지 판단해야 한다.
문제풀이: 데이터 범위가 비교적 작기 때문에 우리는 수조로 각 수가 나타나는 횟수를 계산할 수 있다. 각 원소를 모두 10을 더하면 그들을 모두 정수로 만들 수 있다. 판단을 할 때 우리는 i와 20-i의 곱셈의 합을 기록하면 되지만 특수한 상황에 대한 판단에 주의해야 한다.
코드:
1 #include
2 #define ll long long
3 using namespace std;
4 ll ans=0;
5 int main() {
6 ll n,t;
7 cin>>n;
8 ll num[200]= {0};
9 for(int i=0; i) {
10 cin>>t;
11 num[t+10]++;
12 }
13
14 for(int i=0; i<=10; i++) {
15 if(num[i]!=0) {
16 if(i==10) { // 0 ,
17 ans=ans+num[i]*(num[i]-1)/2;
18 }else{
19 ans=ans+num[i]*num[20-i];
20 }
21 }
22 }
23 cout<endl;
24 return 0;
25 }
F - The World is a Theatre
제목: 이 문제는 사실 배열 그룹의 문제이다. 단지 하나의 제한을 추가했을 뿐이다. 남자의 수는 4보다 적지 않고 여자의 수는 1보다 적지 않으며 구성된 팀의 수는 t이다.
문제풀이: 여기서 유일하게 주의해야 할 것은 조합수의 계산 방법이다. 여기서 먼저 표기표인 양휘삼각형에 도달했고 조합수와 양휘삼각형표는 일일이 대응했다.
코드:
법1:
1 #include
2 #include<set>
3 #include
4 #include
5 #define ll long long
6 using namespace std;
7 ll f[110][110];
8 void app() {
9 memset(f,0,sizeof(f));
10 for(int i=0; i<=30; i++) {
11 f[0][i]=0;
12 f[i][0]=1ll;
13 }
14 for(int i=1; i<=30; i++) {
15 for(int j=1; j<=i; j++) {
16 f[i][j]=(f[i-1][j]+f[i-1][j-1]);
17 }
18 }
19 }
20
21 int main() {
22 int n,m,t;
23 scanf("%d%d%d",&n,&m,&t);
24 //t
25 app();
26 if(n<4||m<1||t<5) {
27 cout<<0<<endl;;
28 } else {
29 ll sum=0;
30 for(int i=4; i<=n&&t-i>=1; i++) {
31 sum=sum+f[n][i]*f[m][t-i];
32 }
33 printf("%I64d
",sum);
34 }
35 return 0;
36 }
법2:
1 #include
2 #include
3 #include
4 #define ll long long
5 using namespace std;
6 ll conb[250][250];
7 //(n<25,m<25)
8 ll f[110][110];
9 void app() {
10 memset(f,0,sizeof(f));
11 for(int i=0; i<=30; i++) {
12 f[0][i]=0;
13 f[i][0]=1ll;
14 }
15 for(int i=1; i<=30; i++) {
16 for(int j=1; j<=i; j++) {
17 f[i][j]=(f[i-1][j]+f[i-1][j-1]);
18 }
19 }
20 }
21 ll sum=0;
22 int main() {
23 ll n,m,t;
24 cin>>n>>m>>t;
25 app();
26 for(int i=4; i<=t&&t-i>=1;i++) {
27 sum=sum+f[n][i]*f[m][t-i];
28 }
29 cout<endl;
30 return 0;
31 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.