2021.1.23--vj补题
B - B
n people are standing in a line to play table tennis. At first, the first two players in the line play a game. Then the loser goes to the end of the line, and the winner plays with the next person from the line, and so on. They play until someone wins k games in a row. This player becomes the winner.
For each of the participants, you know the power to play table tennis, and for all players these values are different. In a game the player with greater power always wins. Determine who will be the winner.
Input
The first line contains two integers: n and k (2 ≤ n ≤ 500, 2 ≤ k ≤ 1012) — the number of people and the number of wins.
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ n) — powers of the player. It's guaranteed that this line contains a valid permutation, i.e. all ai are distinct.
Output
Output a single integer — power of the winner.
Examples
2 2
1 2
2
4 2
3 1 2 4
3
6 2
6 5 3 1 2 4
6
2 10000000000
2 1
2
Note
Games in the second sample:
3 plays with 1. 3 wins. 1 goes to the end of the line.
3 plays with 2. 3 wins. He wins twice in a row. He becomes the winner.
题意:有n个人排成一排比赛,给出了每个人的武力值,开始时前两个人打,输的人去队伍后面,赢的人接着和下一个人打,以此类推,直至有人连赢k场,比赛结束,输出该人的能力值。
需要用long long
思路:从头遍历一遍,如果有人赢得了k场则输出,如果没有那一定是武力值最大的人,直接输出即可。
一开始就按照题目中的来遍历,把输的值排到后面,扩大数组长度,直到某个人武力值达到要求结束遍历,但在测试点18wa掉了,然后就按照上面这个思路来做,也没有直接对,用错了步骤方法,又改了几遍才对。
#include<bits/stdc++.h> using namespace std; int main() { long long n; long long k; cin>>n>>k; long long s[2*n]={0},b[2*n]={0},minn=-1; for(long long i=0;i<n;i++) { cin>>s[i]; minn=max(minn,s[i]); } long long ct=0,i,j; for( j=0;j<n;j++) { if(j!=0&&s[j]>s[j-1]) { ct=1; } else{ ct=0; } for(i=j+1;i<n;i++) { if(s[j]>s[i])ct++; else break; } if(ct>=k) { cout<<s[j]<<endl; break; } } if(j>=n) { cout<<minn<<endl; } }
C - C
Petya learned a new programming language CALPAS. A program in this language always takes one non-negative integer and returns one non-negative integer as well.
In the language, there are only three commands: apply a bitwise operation AND, OR or XOR with a given constant to the current integer. A program can contain an arbitrary sequence of these operations with arbitrary constants from 0 to 1023. When the program is run, all operations are applied (in the given order) to the argument and in the end the result integer is returned.
Petya wrote a program in this language, but it turned out to be too long. Write a program in CALPAS that does the same thing as the Petya's program, and consists of no more than 5 lines. Your program should return the same integer as Petya's program for all arguments from 0 to 1023.
Input
The first line contains an integer n (1 ≤ n ≤ 5·105) — the number of lines.
Next n lines contain commands. A command consists of a character that represents the operation ("&", "|" or "^" for AND, OR or XOR respectively), and the constant xi 0 ≤ xi ≤ 1023.
Output
Output an integer k (0 ≤ k ≤ 5) — the length of your program.
Next k lines must contain commands in the same format as in the input.
Examples
3
| 3
^ 2
| 1
2
| 3
^ 2
3
& 1
& 3
& 5
1
& 1
3
^ 1
^ 2
^ 3
0
Note
You can read about bitwise operations in https://en.wikipedia.org/wiki/Bitwise_operation.
Second sample:
Let x be an input of the Petya's program. It's output is ((x&1)&3)&5 = x&(1&3&5) = x&1. So these two programs always give the same outputs.
题意:给出一个n,然后紧接着跟着n行的程序,每一行含有一个操作符和一个操作数,操作符只有三种与,或,异或。同时规定所有的操作数都在0-1023之间。要求把给出的程序缩短,缩短到5行之内。
自己做的时候理解错了题意,以为是把相同的运算符简化再直接输出,但看了别人的也没有很理解。。。。
我的错误代码:
#include<bits/stdc++.h> #define N 500005 using namespace std; int main() { map<char,int>mp; int n; cin>>n; char ch; int k[N]; for(int i=0;i<n;i++) { cin>>ch>>k[i]; if(mp[ch]==0)mp[ch]=k[i]; else { if(ch=='|') { mp[ch]|=k[i]; } else if(ch=='^')mp[ch]^=k[i]; else if(ch=='&')mp[ch]&=k[i]; } } int m=mp.size(); if(mp['|']==0&&mp['&']==0&&mp['^']==0) cout<<"0"<<endl; else{ cout<<m<<endl; // cout<<"^ "<<mp['^']<<"*"<<endl; if(mp['|']!=0)cout<<"| "<<mp['|']<<endl; if(mp['^']!=0)cout<<"^ "<<mp['^']<<endl; if(mp['&']!=0)cout<<"& "<<mp['&']<<endl; } }
(别人的)正确思路:位运算的等价变换
链接:(具体)
https://www.cnblogs.com/siuginhung/p/7743536.html
正确代码:#include<bits/stdc++.using namespace std;
int main() { int a,b; a = 0,b = 1023; int n; scanf("%d",&n); char s[100]; int num; while(n--) { scanf("%s%d",s,&num); if(s[0] == '|') { a |= num; b |= num; } else if(s[0] == '&') { a &= num; b &= num; } else if(s[0] == '^') { a ^= num; b ^= num; } } int x=0,y=0,z=0; x=a | b; y=a & b; z=a & (b ^ 1023); printf("3\n"); printf("| %d\n",y); printf("& %d\n",x); printf("^ %d\n",z);
}

浙公网安备 33010602011771号