Codeforces 402A 402B 402C 402D
402A 直接暴力
#include <cstdio> #include <cstdlib> #include <cmath> #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <sstream> #include <string> #include <cstring> #include <algorithm> #include <iostream> #define maxn 2010 #define INF 0x7fffffff #define inf 10000000 #define MOD 1000000007 #define ull unsigned long long #define ll long long using namespace std; int main() { int k, a, b, v; scanf("%d%d%d%d", &k, &a, &b, &v); int ans = 0; while(a > 0) { ans ++; if(b >= k-1) { a -= k*v; b = b-k+1; } else { a -= (b+1)*v; b = 0; } } printf("%d\n", ans); return 0; }
402B
修改尽量少的数字使数列成为公差为k的等差数列 (但是不能有负数)
#include <cstdio> #include <cstdlib> #include <cmath> #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <sstream> #include <string> #include <cstring> #include <algorithm> #include <iostream> #define maxn 2010 #define INF 0x7fffffff #define inf 10000000 #define MOD 1000000007 #define ull unsigned long long #define ll long long using namespace std; int num[1010], ans[1010], tem[1010]; int main() { int n, k; memset(ans, 0, sizeof(ans)); scanf("%d%d", &n, &k); for(int i = 0; i < n; ++ i) { scanf("%d", &num[i]); tem[i] = num[i] - i*k; } sort(tem, tem+n); int j = 0; while(tem[j] <= 0) ++ j; int now = tem[j], _max = 0, cnt = 0, cc = tem[j]; for(int i = j; i < n; ++ i) { if(now == tem[i]) ++ cnt; else { if(cnt > _max) { _max = cnt; cc = now; } now = tem[i]; cnt = 1; } } if(cnt > _max) { _max = cnt; cc = now; } printf("%d\n", n-_max); for(int i = 0; i < n; ++ i) { if(cc+i*k > num[i]) printf("+ %d %d\n", i+1, cc+i*k-num[i]); if(cc+i*k < num[i]) printf("- %d %d\n", i+1, num[i]-cc-i*k); } return 0; }
402C 猜了一下 直接枚举一个最有可能的
#include <cstdio> #include <cstdlib> #include <cmath> #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <sstream> #include <string> #include <cstring> #include <algorithm> #include <iostream> #define maxn 2010 #define INF 0x7fffffff #define inf 10000000 #define MOD 1000000007 #define ull unsigned long long #define ll long long using namespace std; int main() { int t, n, p; scanf("%d", &t); while(t --) { scanf("%d%d", &n, &p); int now = 2*n+p, st = 1, k = 1; while(now--) { printf("%d %d\n", st, (st+k)%n == 0 ? n : (st+k)%n); ++ st; if(st == n+1) { st = 1; ++ k; } } } return 0; }
402D
数学加贪心
#include <cstdio> #include <cstdlib> #include <cmath> #include <map> #include <set> #include <queue> #include <stack> #include <vector> #include <sstream> #include <string> #include <cstring> #include <algorithm> #include <iostream> #define maxn 2010 #define INF 0x7fffffff #define inf 10000000 #define MOD 1000000007 #define ull unsigned long long #define ll long long using namespace std; int a[5010], cou[5010], pp[100000], m; bool vis[100000]; struct node { int b[5050]; bool find(int x) { for(int i = 0; i < m; ++ i) if(b[i] == x) return true; return false; } }; node prime; int fi_pri() { int j = 0; memset(vis, 1, sizeof(vis)); for(ll i = 2; i < 100000; ++ i) if(vis[i]) { pp[j++] = i; for(ll j = i*i; j < 100000; j += i) vis[j] = false; } return j; } int gcd(int r, int l) { return l == 0 ? r : gcd(l, r%l); } bool can(int i, int j) { int ans = 0; for(int k = 0; k < j; ++ k) if((i % pp[k] == 0) && (prime.find(pp[k]))) while(i % pp[k] == 0) { -- ans; i /= pp[k]; } else while(i % pp[k] == 0) { ++ ans; i /= pp[k]; } if(prime.find(i)) --ans; if(ans < 0) return true; return false; } int f(int s, int j) { if(s == 1) return 0; int i; for(i = 0; i < j; ++ i) if(s%pp[i] == 0) break; if(i != j && prime.find(pp[i])) return f(s/pp[i], j) -1; if(i != j) return f(s/pp[i], j) +1; if(prime.find(s)) return -1; return 1; } int main() { int asd = fi_pri(); int n, g; scanf("%d%d", &n, &m); scanf("%d", &a[0]); g = cou[0] = a[0]; for(int i = 1; i < n; ++ i) { scanf("%d", &a[i]); g = cou[i] = gcd(g, a[i]); } for(int i = 0; i < m; ++ i) scanf("%d", &prime.b[i]); for(int i = n-1; i >= 0; -- i) if(can(cou[i], asd)) for(int j = 0; j <= i; ++ j) { a[j] /= cou[i]; cou[j] /= cou[i]; } int ans = 0; for(int i = 0; i < n; ++ i) ans += f(a[i], asd); printf("%d\n", ans); return 0; }