a.水
b.n长度的街道有m个路灯,给出每个路灯的位置,求灯光能覆盖所有地方的最小灯光半径,水;
c.小明有n们课程要达到一个规定的总分数,一直目前每科达到的分数和每科的总分,买每门课程分数所需费用给出,问最少得花多少钱;贪心,水;
d.两个人刷怪,问谁能给出最后一击,给出怪物的血量,小明每1/m秒出击一次,小红1/n秒出击一次;
由于m,n<=1000000怪物血量<=1000000000
先打表一秒内两人对m+n以内的血的出击情况,暴力就行,但用double存会wa所以用分数存
能知道每秒两人造成的伤害为m+n,那么用a[怪物血量%(m+n)]就是答案
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const long long maxa = 2000005; long long a[maxa]; long long ss(long long suma, long long a, long long sumb, long long b){ if(suma * b > sumb * a){ return 1; }else if(suma * b < sumb * a){ return 0; }else return 2; } int main(){ long long n, aa, b; cin>>n>>aa>>b; long long sumx = 0, sumy = 0; for(long long i = 1; i <= aa+b; i++){ long long u = ss(sumx+1,aa,sumy+1,b); //printf("%d ", u); if(u == 0){ sumx ++; a[i] = 0; }else if(u == 1){ sumy ++; a[i] = 1; }else{ sumx ++;sumy ++; a[i++] = 2; a[i] = 2; } } a[0] = a[aa+b]; while(n--){ long long s; cin>>s; if(a[s%(aa+b)] == 0){ printf("Vanya "); }else if(a[s%(aa+b)]==1){ printf("Vova "); }else printf("Both "); } }
e.有n*n的期盼每个位置的下个位置为(x+dx,y+dy),dx,dy与n互质给出m个点求从哪一点出发走的路径包含最多的点,又扩展欧几里得可知a*x+b*y所经历最小正值为gcd(a,b)
由题意可知gcd(a,b) = 1;所以每个点都会走n个不同点(x和y均不重复)后回到原点,打表出任一点的路径情况,吗,每条路径都不会有重复的点并且平行所以(a[x]+n-y)相同的点必定在一条路径上
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; const int maxa = 1000005; int a[maxa]; int b[maxa]; int main(){ int n, m, p, q; while(cin>>n>>m>>p>>q){ int u= 0, v= 0; for(int i = 0; i < n; i++){ a[u] = v; u = (u + p) % n; v = (v + q) % n; } int ansx, ansy; int maxn = 0; for(int i = 0 ; i < m;i++){ int x, y; scanf("%d%d", &x, &y); b[(a[x]+n-y)%n] ++; if(b[(a[x]+n-y)%n] > maxn){ maxn = b[(a[x]+n-y)%n]; ansx = x; ansy = y; } } printf("%d %d ", ansx, ansy); } }