点个赞谢谢!!!
1538 - 小 X 与煎饼达人(flip)
#include <bits/stdc++.h>
using namespace std;
int const N = 1e6 + 10;
int a[N];
int n, m, c;
int main() {
scanf("%d%d", &n, &m);
int x, y;
for (int i = 1; i <= m; i++) {
scanf("%d%d", &x, &y);
a[x] += 1;
a[y + 1] -= 1;
}
for (int i = 1; i <= n; i++) {
a[i] = a[i] + a[i - 1];
if (a[i] % 2 != 0) {
c++;
}
}
printf("%d\n", c);
return 0;
}
1541 - 小 X 学游泳(swim)
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[50][50];
//走到每个点危险系数和的最小值
int d[50][50];
//方向值变化的数组
int fx[5] = {0,0,1,0,-1};
int fy[5] = {0,1,0,-1,0};
//深搜求走到每个点经过的危险系数和的最小值
void dfs(int x,int y,int sum){
d[x][y] = sum;
//循环四方向
int tx,ty;
for(int i = 1;i <= 4;i++){
tx = x + fx[i];
ty = y + fy[i];
//如果该点可行:走到该点的危险系数的和更小
//走到tx,ty点的危险系数 = 走到x,y点的危险系数 + tx,ty点的危险系数
if(sum+a[tx][ty]<d[tx][ty]){
dfs(tx,ty,sum+a[tx][ty]);
}
}
}
int main(){
cin>>n>>m;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
cin>>a[i][j];
d[i][j] = INT_MAX;
}
}
dfs(1,1,a[1][1]);
cout<<d[n][m];
return 0;
}
1800 - 小朋友的数字
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e6 + 10;
LL n,p,a[N];
LL s[N],f[N],score[N],r,ma = LONG_LONG_MIN;
int main() {
cin>>n>>p;
for(int i = 1; i <= n; i++) {
cin>>a[i];
s[i] = max(s[i-1]+a[i],a[i]);
ma = max(ma,s[i]);
f[i] = ma % p;
}
score[1] = f[1];
LL ans = score[1];
ma = LONG_LONG_MIN;
for(int i = 2; i <= n; i++) {
ma = max(ma,f[i-1]+score[i-1]);
score[i] = ma;
ans = max(ans,ma) % p;
}
cout<<ans;
return 0;
}
1803 - 01迷宫
#include <bits/stdc++.h>
using namespace std;
char a[1010][1010];
int q[1000010][3],h,t;//存储走过的点
int d[1010][1010];//存储从每个点出发最多能走到几个点
bool f[1010][1010];
int fx[5] = {0,0,1,0,-1};
int fy[5] = {0,1,0,-1,0};
int n,m;//n*n的迷宫,m次询问
void bfs(int x,int y){
h = 1,t = 1;
q[1][1] = x;
q[1][2] = y;
f[x][y] = true;//走过标记
int tx,ty;
while(h <= t){
for(int i = 1;i <= 4;i++){
tx = q[h][1] + fx[i];
ty = q[h][2] + fy[i];
//不能出迷宫,没有走过,且值不一样
if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&f[tx][ty]==false&&a[tx][ty]!=a[q[h][1]][q[h][2]]){
//入队,标记
t++;
q[t][1] = tx;
q[t][2] = ty;
f[tx][ty] = true;
}
}
h++;
}
//循环队列,设置从队列中每个点出发能走到的点的数量都是队列长度
for(int i = 1;i <= t;i++){
d[q[i][1]][q[i][2]] = t;
}
}
int main()
{
cin>>n>>m;
//读入地图
for(int i = 1;i <= n;i++){
scanf("%s",a[i]+1);
}
//读入m次询问
int x,y;
for(int i = 1;i <= m;i++){
scanf("%d%d",&x,&y);
//判断从xy出发能走到几个点,是否求过
if(d[x][y] == 0) bfs(x,y);
printf("%d\n",d[x][y]);
}
return 0;
}
1549 - 密码锁
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>
typedef long long LL;
using namespace std;
int prim[9600], vis[100005], tot, num[6], nu[6];
char s[6];
void get_prim(){
for (int i = 2; i < 100000; i++){
if(!vis[i]) prim[tot++] = i;
for (int j = 0; j < tot && prim[j] * i < 100000; j++){
vis[prim[j] * i] = 1;
if(i % prim[j] == 0) break;
}
}
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
get_prim();
scanf("%s", s);
for (int i = 0; i < 5; i++) num[i] = s[i] - '0';
int tim = 0x3f3f3f3f, ans;
for (int i = 0; i < tot; i++){
int cnt = 4, t = prim[i], w = 0;
while(t){
nu[cnt--] = t % 10;
t /= 10;
}
while(cnt >= 0) nu[cnt--] = 0;
for (int i = 0; i < 5; i++){
int t1 = nu[i] - num[i], t2 = num[i] - nu[i];
if(t1 < 0) t1 += 10;
if(t2 < 0) t2 += 10;
w += min(t1, t2);
}
if(tim >= w){
tim = w;
ans = prim[i];
}
}
int t = ans, cnt = 0;
while(t) cnt++, t /= 10;
for (int i = 1; i <= 5 - cnt; i++) printf("0");
printf("%d\n", ans);
return 0;
}
1550 - 房屋积水
#include <bits/stdc++.h>
using namespace std;
int h[105];
int main(){
int n,R;
cin>>n>>R;
h[1] = R%10;
int maxH = h[1];
int maxIdx = 1;
int tileSum = h[1];
for(int i=2;i<=n;i++){
R = (R * 6807 + 2831) % 201701;
h[i] = R%10;
tileSum += h[i];
if(h[i]>=maxH){
maxH = h[i];
maxIdx = i;
}
}
int barrier = h[1];
int sum = maxH - h[1]; // 溜掉的水
for(int i=2;i<maxIdx;i++){
if(h[i]>barrier){
barrier = h[i];
}
sum += maxH-barrier; // 加上本列漏掉的水
}
barrier = h[n];
sum += maxH-h[n];
for(int i=n-1;i>maxIdx; i--){
if(h[i]>barrier){
barrier = h[i];
}
sum += maxH-barrier; // 加上本列漏掉的水
}
cout << n*maxH - tileSum - sum;
return 0;
}