题意:对一个数字串轮流进行如下操作:
1.任选两个不同位置的数字交换
2.删除最后一个数字
问最后剩下的最小的数字是多少
分析:贪心,最后剩下的数一定是第一个位置上的数,那么一开始就把最小的数字放第一位即可,特判数字串长度为2的情况
ac代码
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> #include<map> #include<vector> #include<stack> #include<set> #include <sstream> #include <fstream> #include <cmath> #include <iomanip> #include <unordered_map> #define x first #define y second #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define endl '\n' #define pb push_back #define pi 3.14159265358979323846 using namespace std; typedef long long LL; typedef pair<int,int> PII; const int N = 200010,M = 500010,INF = 0x3f3f3f3f,mod = 1e9 + 7 ; const double INFF = 0x7f7f7f7f7f7f7f7f; int t,n,m,x,y,k; int a[N]; string s; int main() { ios; cin >> t; while(t --) { cin >> s; if(s.size() == 2) cout << s[1] << endl; else { int ans = INF; for(auto i : s) { ans = min(ans,int(i - '0')); } cout << ans << endl; } } return 0; }
题意:给定三个数字a,b,c
问满足下列情况的三个数字:
\(xmody=a\),
\(ymodz=b\),
\(zmodx=c\).
分析:直接构造
ac代码
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> #include<map> #include<vector> #include<stack> #include<set> #include <sstream> #include <fstream> #include <cmath> #include <iomanip> #include <unordered_map> #define x first #define y second #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define endl '\n' #define pb push_back #define pi 3.14159265358979323846 using namespace std; typedef long long LL; typedef pair<int,int> PII; const int N = 200010,M = 500010,INF = 0x3f3f3f3f,mod = 1e9 + 7 ; const double INFF = 0x7f7f7f7f7f7f7f7f; int t,n,m,x,y,k; int a[N]; string s; int main() { ios; cin >> t; while(t --) { int a,b,c; cin >> a >> b >> c; cout << a + b + c << ' ' << b + c << ' ' << c << endl; } return 0; }
题意:给定一个矩阵,问是否能通过交换两列一次的操作,使每行都是非递减序列。
模拟
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> #include<map> #include<vector> #include<stack> #include<set> #include <sstream> #include <fstream> #include <cmath> #include <iomanip> #include <unordered_map> #define x first #define y second #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define endl '\n' #define pb push_back #define pi 3.14159265358979323846 using namespace std; typedef long long LL; typedef pair<int,int> PII; const int N = 200010,M = 500010,INF = 0x3f3f3f3f,mod = 1e9 + 7 ; const double INFF = 0x7f7f7f7f7f7f7f7f; int n,m,k,x,y; void solve(vector<vector<int>> & a) { vector<int> need; for(int i = 0;i < n && need.empty();i ++) { vector<int> b = a[i]; sort(b.begin(),b.end()); for(int j = 0;j < m;j ++) { if(a[i][j] != b[j]) need.pb(j); } } if((int)need.size() > 2) { cout << -1 << endl; return ; } if((int)need.size() == 0) { cout << 1 << ' ' << 1 << endl; return ; } for(int i = 0;i < n;i ++) swap(a[i][need[0]],a[i][need[1]]); for(int i = 0;i < n;i ++) for(int j = 1;j < m;j ++) if(a[i][j - 1] > a[i][j] ) { cout << -1 << endl; return ; } cout << need[0] + 1 << ' ' << need[1] + 1 << endl; return; } int main() { ios; int t; cin >> t; while(t --) { cin >> n >> m; vector<vector<int>> a(n, vector<int>(m)); for(int i = 0;i < n;i ++) for(int j = 0;j < m;j ++) cin >> a[i][j]; solve(a); } return 0; }
题意:有一排陷阱,必须按顺序踩过去,可以选择k个跳过去,但每次跳跃都会使后面的每个陷阱伤害加一,问最小的伤害数。
分析:
考虑每次跳跃对伤害的贡献:
第一次:n - i + k - 1;
第二次:n - i + k - 2;
第三次:n - i + k - 3;
...
所以跳跃对伤害的总贡献 : \(\sum_{i = 1} ^ k n - pi + k - i = k * n - \sum_{i = 1} ^ k pi + k * k / 2\)
所以所受伤害:$\sum_{i = 1} ^ n ai + k * n - \sum_{i = 1} ^ k pi + k * k / 2 - ? $
其中的 ? 就是跳过去的原始伤害,贪心的想,令其最大
ac代码
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> #include<map> #include<vector> #include<stack> #include<set> #include <sstream> #include <fstream> #include <cmath> #include <iomanip> #include <unordered_map> #define x first #define y second #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define endl '\n' #define pb push_back #define pi 3.14159265358979323846 using namespace std; typedef long long LL; typedef pair<int,int> PII; const int N = 200010,M = 500010,INF = 0x3f3f3f3f,mod = 1e9 + 7 ; const double INFF = 0x7f7f7f7f7f7f7f7f; int n,m,k,x,y; int a[N]; int main() { ios; int t; cin >> t; while(t --) { priority_queue<PII> h; cin >> n >> k; for(int i = 0;i < n;i ++) cin >> a[i],h.push({a[i] + i,i}); vector<bool> st(n, false); for(int i = 0;i < k;i ++) { auto t = h.top(); h.pop(); st[t.second] = true; } LL ans = 0,t = 0; for(int i = 0;i < n;i ++) { if(st[i]) t++; else ans += t + a[i]; } cout << ans << endl; } return 0; }