标签:tar csu out 方向 cin 一个人 char sony 保存
分析可得bi=ai+ai+1
分析可得bi=ai+ai+1
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 7; int a[maxn]; int main(int argc, char const *argv[]) { int n; cin >> n ; for(int i = 1;i <= n;i ++) cin >> a[i]; for(int i = 1;i < n ;i ++) cout << a[i] + a[i + 1] << " "; cout << a[n] << endl; return 0; }
一个人站在坐标原点处,他可以往上(U), 下(D), 左(L), 右(R), 四个方向移动,现给你一个移动序列,为了使他最后仍然能回到原点,你需要对这个序列做一些改变,每次可以改变其中一个字母,问最少的改变次数.
如果这个序列的长度是奇数,那么肯定不可能回到原点,则直接输出“-1”, 否则可以这么想, 如果 “U” 与 “ D” 和 “L” 与 “R” 能成对出现(和出现次序无关), 那么肯定可以回到原点,所以这里需要做的就是分别统计这四个操作出现的次数, 水平方向相减, 竖直方向相减, 意味着去掉成对出现的对数. 如果结果不为 0 ,那么就需要做出改变,可以想到, 对相减后的差值除 2 就可以得到最少的改变次数.
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 7; int a[maxn]; int main(int argc, char const *argv[]) { string str; cin >> str; int l , r , u , d; l = r = u = d = 0; for(int i = 0;i < str.size();i ++){ if(str[i] ==‘L‘) l ++; if(str[i] ==‘R‘) r ++; if(str[i] ==‘U‘) u ++; if(str[i] ==‘D‘) d ++; } int ans = abs(l - r) + abs(u - d); if(str.size() % 2 == 0) cout << ans / 2<< endl; //if(str[i] ==‘L‘) l ++; else cout << -1 << endl; return 0; }
题目大意:给你一个长度为x的等边三角形,每一秒你能修改一条边的长度,要你修改到长度为y的等边三角形,要求修改过程中保证它是一个三角形。
解题思路:从y开始倒着往x推。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 7; int a[maxn]; priority_queue<int>q; int main(int argc, char const *argv[]) { int n , m ; cin >> n >> m ; // q.push(m); // q.push(m); // q.push(m); // //q.push(1); // while(q.top() != n ){ // int t = q.top(); // q.pop(); // if(t) // } std::vector<int > v; v.push_back(m); v.push_back(m); v.push_back(m); int i = 0; int ans = 0; while(v[0] < n){ ans ++; //for(int i = 0;i < 3;i ++){ v[0] = v[1] + v[2] - 1; //if(v[i] >= n) v[i] = n; //} sort(v.begin(), v.end()); // for(int i = 0;i < 3 ;i ++){ // cout << v[i] << endl; // } // cout << "-----------" << endl; } cout << ans << endl; return 0; }
一个multiset,有t个操作,其中+ a表示multiset中加入一个数a,-a表示从multiset取出a,?表示每次询问一个01串s,如果s的一位是0,那么所匹配的数的该位应该是偶数,反之如果是1所匹配的改位应该是奇数。如果匹配时产生数位不够的问题的话添加前导0。每次询问有多少个数和s串能够匹配。
不是题目中有multiset,就一定要用multiset,这题其实就是题目难读,仔细思考一下用map操作一下就好了
+a时将 a变成一个对应询问的01串即可。举例说明:
361==101
241==001==1
然后对应保存这个得到的01串(要用long long )为tmp,然后map[tmp]++;
同理-a 对应着map[tmp]--;
那么在询问的时候,直接输出当前01串映射的值即可。
#include<bits/stdc++.h> using namespace std; const int maxn = 1e5 + 7; int a[maxn]; std::map<long long , int> mp; char s[2]; long long x; string str; long long solve(string x){ long long tmp = 0; for(int i = 0;i < x.size(); i ++){ tmp = tmp * 10 + ((x[i] - ‘0‘) % 2) ; } return tmp; } int main(int argc, char const *argv[]) { int n; cin >> n ; for(int i = 1;i <= n ; i ++){ cin >> s ; if(s[0] == ‘+‘) {cin >> str; long long a = solve(str); // string a; // for(int i = 0;i < str.size(); i++){ // if((str[i] - ‘0‘) % 2 == 0) a.push_back(‘0‘); // else a.push_back(‘1‘); // } //cout << a << endl; mp[a] ++; } if(s[0] == ‘-‘){ cin >> str; // string a; // for(int i = 0;i < str.size(); i++){ // if(str[i] - ‘0‘ % 2 == 0) a.push_back(‘0‘); // else a.push_back(‘1‘); // } long long a = solve(str); mp[a] --; } if(s[0] == ‘?‘){ cin >> x; cout << mp[x] << endl; } } return 0; }
F - Sonya and Problem Wihtout a Legend
https://blog.csdn.net/lycheng1215/article/details/80089004
https://blog.csdn.net/lycheng1215/article/details/80089004
#include<bits/stdc++.h> using namespace std; const int maxn = 2e5 + 7; int a[maxn]; priority_queue<int>s; int main(int argc, char const *argv[]) { int n; cin >> n; long long ans = 0; for(int i = 1;i <= n ; i ++) { cin >> a[i]; a[i] -= i; s.push(a[i]); if(s.top() > a[i]){ ans += s.top() - a[i]; s.pop(); s.push(a[i]); } } cout << ans << endl; return 0; }
标签:tar csu out 方向 cin 一个人 char sony 保存
原文地址:https://www.cnblogs.com/DWVictor/p/11305241.html