2020년 04월 05일 - 개인전

36001 단어

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 }

좋은 웹페이지 즐겨찾기