A.游戏机
思路:判断三个字符是否相等即可
代码如下:
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- int main(){
- string a; cin >> a;
- if(a[0] == a[1] && a[0] == a[2]) puts("Won");
- else puts("Lost");
- return 0;
- }
B.小星喝酒
思路:遍历计算
代码如下:
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int maxn = 1e6 + 7;
- const ll mod = 1e9 + 7;
- int main()
- {
- int n, x;
- cin >> n >> x;
- int ans = -1;
- ll cnt = 0;
- for(int i = 0; i < n; ++i){
- int a, b;
- cin >> a >> b;
- cnt += a * b;
- if(ans == -1){
- if(cnt > x * 100)ans = i + 1;
- }
- }
- cout << ans << "\n";
- return 0;
- }
C.取水果
思路:暴力可以通过,单调栈时间复杂度更好
以下是单调栈代码:
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 10010;
- int n;
- int h[N];
- int q[N], tot;
- int l[N], r[N];
- int main()
- {
- cin >> n;
- for (int i = 1; i <= n; i ++ ) cin >> h[i];
- h[0] = h[n + 1] = -1;
- q[0] = 0; tot = 0;
- for (int i = 1; i <= n; i ++ )
- {
- while (tot >= 1 && h[i] <= h[q[tot]]) tot --;
- l[i] = q[tot];
- q[++ tot] = i;
- }
- q[0] = n + 1, tot = 0;
- for (int i = n; i >= 1; i -- )
- {
- while (tot >= 1 && h[i] <= h[q[tot]]) tot --;
- r[i] = q[tot];
- q[++ tot] = i;
- }
- int s = 0;
- for (int i = 1; i <= n; i ++ )
- s = max(s, h[i] * (r[i] - l[i] - 1));
- cout << s << endl;
- }
D.与或问题
思路:线性dp
dp[i][0/1]=>第i个位置为0/1的种数
代码如下:
- #include <bits/stdc++.h>
- #define int long long
- using namespace std;
- const int mod = 1e9 + 7;
- const int maxn = 1e6 + 10;
- int dp[100][2];
- string s[100];
- void solve() {
- int n;
- cin>>n;
- for (int i = 1; i <=n; ++i) {
- cin>>s[i];
- }
- dp[0][0]=dp[0][1]=1;
- for (int i = 1; i <=n; ++i) {
- if(s[i][0]=='A'){
- dp[i][1]=dp[i-1][1];
- dp[i][0]=dp[i-1][0]*2+dp[i-1][1];
- } else{
- dp[i][0]=dp[i-1][0];
- dp[i][1]=dp[i-1][1]*2+dp[i-1][0];
- }
- }
- cout<<dp[n][1];
- }
- signed main() {
- // ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
- int _ = 1;
- // cin >> _;
- while (_--) {
- solve();
- }
- return 0;
- }
E.旋转与翻转问题
思路:
1.( x , y )顺时针旋转90°后变成 ( y , − x )
2. ( x , y )逆时针旋转90°后变成 ( − y , x )
3. ( x , y ) 以 x = p对称时变成 ( 2 p − x , y )
4.( x , y ) 以 y = p对称时变成 ( x , 2 p − y )
有了这个我们只需要 记录每次旋转的变换参数, 后面直接代入x, y的坐标就能求出答案了。
代码如下:
- #include<bits/stdc++.h>
- using namespace std;
- const int N = 2e5 + 7;
- typedef long long ll;
- ll n, x[N], y[N], m, q;
- ll a[N], b[N], fza[N], fzb[N], visa[N], visb[N];
- int main() {
- ios::sync_with_stdio(0);
- cin >> n;
- for (int i = 1; i <= n; i++) {
- cin >> x[i] >> y[i];
- }
- cin >> m;
- a[0] = 0, b[0] = 0;
- fza[0] = fzb[0] = 1;
- visa[0] = 1, visb[0] = 2;
- for (int i = 1; i <= m; i++) {
- int op;
- cin >> op;
- if (op == 3) {
- ll p;
- cin >> p;
- a[i] = 2 * p - a[i - 1];
- b[i] = b[i - 1];
- visa[i] = visa[i - 1];
- visb[i] = visb[i - 1];
- fza[i] = -fza[i - 1];
- fzb[i] = fzb[i - 1];
- } else if (op == 4) {
- ll p;
- cin >> p;
- b[i] = 2 * p - b[i - 1];
- fzb[i] = -fzb[i - 1];
- a[i] = a[i - 1];
- visa[i] = visa[i - 1];
- visb[i] = visb[i - 1];
- fza[i] = fza[i - 1];
- } else if (op == 2) {
- if (visa[i - 1] == 1) {
- visa[i] = 2;
- visb[i] = 1;
- } else {
- visa[i] = 1;
- visb[i] = 2;
- }
- a[i] = b[i - 1];
- b[i] = a[i - 1];
- fza[i] = fzb[i - 1];
- fzb[i] = fza[i - 1];
- fza[i] = -fza[i];
- a[i] = -a[i];
- } else {
- if (visa[i - 1] == 1) {
- visa[i] = 2;
- visb[i] = 1;
- } else {
- visa[i] = 1;
- visb[i] = 2;
- }
- a[i] = b[i - 1];
- b[i] = a[i - 1];
- fza[i] = fzb[i - 1];
- fzb[i] = fza[i - 1];
- fzb[i] = -fzb[i];
- b[i] = -b[i];
- }
- }
- int q; cin >> q;
- while (q--) {
- int A, B;
- cin >> A >> B;
- ll ansx = x[B], ansy = y[B];
- if (visa[A] == 1) {
- ansx = ansx * fza[A] + a[A];
- ansy = ansy * fzb[A] + b[A];
- } else {
- ll cnt = ansx;
- ansx = ansy * fza[A] + a[A];
- ansy = cnt * fzb[A] + b[A];
- }
- cout << ansx << " " << ansy << endl;
- }
- }
F.移位计数
思路:
我们可以先通过归并排序求出原序列的逆序对。然后每一次把序列的第一个数轮换到序列末尾,看逆序对数是多少。每一次只需要找到序列第一个数在全排列中的位置,进行相应的更新即可,可以使用二分查找。
代码如下:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- int n;
- int a[300010];
- int b[300010];
- int c[300010];
- int d[300010];
- ll cnt;
- void merge_sort(int l, int r){
- if(l + 1 >= r)//涓€涓厓绱犱笉鐢ㄦ帓搴?
- return ;
- int mid = (l+r)/2;
- merge_sort(l, mid), merge_sort(mid, r);
- int l1 = l, r1= mid;
- int l2 = mid, r2 = r;
- int tot = l;
- while(l1 < r1 || l2 < r2){
- if((l1 < r1 && a[l1] <= a[l2]) || l2 >= r2){
- b[tot++] = a[l1++];
- }
- else{
- b[tot++] = a[l2++];
- cnt += 1ll*(r1 - l1);
- }
- }
- for(int i = l; i < r; i++)
- a[i] = b[i];
- }
- int main(){
- cin >> n;
- for(int i = 0; i < n; i++){
- cin >> a[i];
- c[i] = a[i];
- d[i] = i;
- }
- cnt = 0;
- merge_sort(0, n);
- cout << cnt << "\n";
- for(int k = 0; k < n-1; k++){
- int t = lower_bound(d, d+n, c[k]) - d;
- cnt -= 1ll*t;
- cnt += 1ll*(n - 1 - t);
- cout << cnt << "\n";
- }
- return 0;
- }