标签:题意 acm sort 区间 wol 初始 cow turn har
题目
A题意:定义一个自然数,若它的质因数至少是两重的,则称为漂亮数,若相邻两个自然数都是“漂亮数”, 就称它们为“孪生漂亮数”。输出[n,m]区间所有孪生漂亮数。
解法:类似质因数分解,如果存在某一质因数判断该质因数是否是两个以上。
int n , m ;
bool eluer(int x){
rep(i , 2 , sqrt(x)){
if(x % i == 0){
int cnt = 0 ;
while(x % i == 0){
x /= i ;
cnt++;
}
if(cnt == 1) return false;
}
}
if(x > 1) return false;
return true;
}
void solve(){
scanf("%lld%lld" , &n , &m);
vector<int>a;
rep(i , n , m){
if(eluer(i)){
a.pb(i);
}
}
int flag = 0 ;
for(int i = 1 ; i < size(a) ; i++){
if(a[i] - a[i-1] == 1){
flag = 1 ;
cout << a[i-1] << " " << a[i] << endl;
}
}
if(!flag){
cout << "no find" << endl;
}
}
C题意:模拟。
const int N = 4e2+9;
const int maxn = 29;
int t , n , m ;
struct grid{
int t , d ;//土地类型和土壤时间
}g[maxn][maxn];
int sl , wl;//羊和狼的数量
struct Sheep{
int x , y , d , l;//羊的坐标、饥饿度,是否存活
}s[N];
struct Wolf{
int x , y , d , l;//同上
}w[N];
void cow(){//土壤长草
rep(i , 1 , n){
rep(j , 1 , m){
if(g[i][j].t == 3){//土壤类型
g[i][j].d++;
if(g[i][j].d > 3){//坑点1:三天后长草
g[i][j].t = 2 ;
}
}
}
}
}
void sw_move(){//羊移动、狼移动
rep(i , 1 , sl){
if(s[i].l == 1){//存活的羊
s[i].x++;
if(s[i].x == n+1) s[i].x = 1 ;
s[i].d++;//羊饥饿度增加
}
}
rep(i , 1 , wl){
if(w[i].l == 1){//存活的狼
w[i].y++;
if(w[i].y == m+1) w[i].y = 1 ;
w[i].d++;//狼的饥饿度增加
}
}
}
void eatsheep(){//羊吃狼
rep(i , 1 , sl){
rep(j , 1 , wl){
if(s[i].l == 1 && w[j].l == 1 && s[i].x == w[j].x && s[i].y == w[j].y){//羊和狼位于同一土壤
s[i].l = 0 ;//狼吃羊
g[s[i].x][s[i].y].t = 1 ;//该地变为残骸
w[j].d = 0 ;
}
}
}
rep(i , 1 , wl){
if(w[i].l == 1){
if(w[i].d>=10){//狼饿死
w[i].l = 0 ;
g[w[i].x][w[i].y].t = 1 ;
}
}
}
}
void eatcow(){//羊吃草
rep(i , 1 , sl){
if(s[i].l == 1){
int x = s[i].x , y = s[i].y ;
if(g[x][y].t == 2){//羊吃草
s[i].d = 0 ;
g[x][y].t = 3 ;
g[x][y].d = 0;
}else{
if(s[i].d >= 5){//羊饿死
s[i].l = 0 ;
g[x][y].t = 1 ;
}
}
}
}
}
void turn(){//坑点2
rep(i , 1 , n){
rep(j , 1 , m){
if(g[i][j].t == 3 && g[i][j].d >= 3){//T天后土壤状态是否长草
g[i][j].t = 2;
}
}
}
}
void solve(){
scanf("%lld%lld%lld" , &t , &n , &m);
rep(i , 1 , n){
rep(j , 1 , m){
char c ;
cin >> c;
g[i][j].t = 3 , g[i][j].d = 0 ;//初始都为土壤
if(c == ‘S‘){
s[++sl].x = i , s[sl].y = j , s[sl].d = 0 , s[sl].l = 1;
}else if(c == ‘W‘){
w[++wl].x = i , w[wl].y = j , w[wl].d = 0 , w[wl].l = 1;
}
}
}
rep(i , 1 , t){
cow();
sw_move();
eatsheep();
eatcow();
}
turn();
set<pii>sh , wo;
rep(i , 1 , sl){//记录存活的羊的坐标
if(s[i].l == 1){
sh.insert(mp(s[i].x , s[i].y));
}
}
rep(i, 1 , wl){//记录存活的狼的坐标
if(w[i].l == 1){
wo.insert(mp(w[i].x , w[i].y));
}
}
rep(i , 1 , n){
rep(j , 1 , m){
if(sh.count(mp(i , j))){//该坐标存在羊
printf("S");
}else if(wo.count(mp(i , j))){//该坐标存在狼
printf("W");
}else if(g[i][j].t == 1){
printf("*");
}else if(g[i][j].t == 2){
printf("#");
}else{
printf(".");
}
}
printf("\n");
}
}
D题意:在一条直线上给出n个摊位的坐标,要使的任意两个摊位的坐标距离正好是k米,问摊位最少移动距离为多少。
解法:中位数原理,所有摊位向中位数靠拢。
int n , m ;
void solve(){
int n , k ;
scanf("%lld%lld" , &n , &k);
vector<int>a(n);
rep(i , 0 , n-1){
cin >> a[i];
}
sort(all(a));
int mid = size(a)/2;
int t = mid-1 , d = a[mid]-k , sum = 0;//摊位下标,该摊位该去的位置
while(t>=0){
sum += abs(d-a[t]);
d -= k ;
t--;
}
t = mid + 1 , d = a[mid]+k ;
while(t < size(a)){
sum += abs(d-a[t]);
d += k ;
t++;
}
cout << sum << endl;
}
标签:题意 acm sort 区间 wol 初始 cow turn har
原文地址:https://www.cnblogs.com/nonames/p/13181482.html