A - 2 链接: https://codeforces.com/problemset/problem/1692/A 分析: 输入四个数后比较 a 和 b c d 的大小,如果 a 小了,ans加一,最后输出 ans即可。代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <bits/stdc++.h> using namespace std;#define int long long #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); void solve () { int a,b,c,d; cin>>a>>b>>c>>d; int ans=0 ; if (b>a)ans++; if (c>a)ans++; if (d>a)ans++; cout<<ans<<endl; } signed main () { IOS int t; cin>>t; while (t--) { solve (); } }
B - 0 链接: https://codeforces.com/problemset/problem/1692/B 分析: 求至多剩多少个数就使这个数组的元素各不相同,我们每次找到两个元素个数大于一的数,把他删除,这样可以使数组长度尽可能大,最后删除次数是上取整的。可以用桶来计数。代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 #include <bits/stdc++.h> using namespace std;#define int long long #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); const int N=1e4 +5 ;int a[N];void solve () { int n; cin>>n; memset (a,0 ,sizeof a); int ans=0 ; for (int i=0 ;i<n;i++) { int b; cin>>b; if (!a[b])a[b]++; else ans++; } cout<<n-2 *ceil (ans*1.0 /2 )<<endl; } signed main () { IOS int t; cin>>t; while (t--) { solve (); } }
C - 2 链接: https://codeforces.com/problemset/problem/1692/C 分析: 这个题我们可以看出来,在主教那一行、列都只有主教一个人,所以可以扫描行或列,就能找到答案。代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #include <bits/stdc++.h> using namespace std;#define int long long #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); char a[9 ][9 ];void solve () { for (int i=1 ;i<=8 ;i++) { for (int j=1 ;j<=8 ;j++) cin>>a[i][j]; } for (int i=2 ;i<=7 ;i++) { for (int j=2 ;j<=7 ;j++) { if (a[i-1 ][j-1 ]=='#' &&a[i+1 ][j-1 ]=='#' &&a[i-1 ][j+1 ]=='#' &&a[i+1 ][j+1 ]=='#' &&a[i][j]=='#' ) { cout<<i<<" " <<j<<endl; break ; } } } } signed main () { IOS int t; cin>>t; while (t--) { solve (); } }
D - 6 链接: https://codeforces.com/problemset/problem/1692/D 分析: 从输入的时间点开始枚举直到这个时间点再次出现。把时间都转换为分钟会好看一些。代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #include <bits/stdc++.h> using namespace std;#define int long long #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); bool check (int minute) { int h=minute/60 ; minute=minute%60 ; if (h%10 ==minute/10 &&h/10 ==minute%10 ) return true ; else return false ; } void solve () { int t1,t2; char s; cin>>t1>>s>>t2; int t,ans=0 ; cin>>t; int minute=t1*60 +t2; do { if (check (minute))ans++; minute+=t; minute%=1440 ; }while (minute!=t1*60 +t2); cout<<ans<<endl; } signed main () { IOS int t; cin>>t; while (t--) { solve (); } }
也可以直接标记出回文时间的分钟数,直接进行匹配
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #include <bits/stdc++.h> using namespace std;#define int long long #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); const int p[16 ] = {0 ,70 ,140 ,210 ,280 ,350 ,601 ,671 ,741 ,811 ,881 ,951 ,1202 ,1272 ,1342 ,1412 };void solve () { int t1,t2; char s; cin>>t1>>s>>t2; int t,ans=0 ; cin>>t; int minute=t1*60 +t2; do { for (int i=0 ;i<16 ;i++) { if (minute==p[i]) { ans++; break ; } } minute+=t; minute%=1440 ; }while (minute!=t1*60 +t2); cout<<ans<<endl; } signed main () { IOS int t; cin>>t; while (t--) { solve (); } }
E - 新 链接: https://codeforces.com/problemset/problem/1692/E 分析: 显然,如果数组本身的和就小于 s,那是肯定无解的。 然后从第一个数开始,用 l, r 代表左右端,然后进行遍历加入操作,直到达到数组长度,取最少的操作次数输出。代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 #include <bits/stdc++.h> using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); const int N=2e5 +5 ;int a[N];void solve () { int n,s; cin>>n>>s; int sum=0 ; for (int i=0 ;i<n;i++) { cin>>a[i]; sum+=a[i]; } if (sum<s) { cout<<"-1" <<endl; return ; } int l=0 ,r=0 ; sum=a[0 ]; int ans=0x3f3f3f3f ; while (l<n&&r<n) { if (sum==s){ ans=min (ans,l+n-r-1 ); sum+=a[++r]; }else if (sum>s) { sum-=a[l++]; }else { sum+=a[++r]; } } cout<<ans<<endl; } signed main () { IOS int t; cin>>t; while (t--) { solve (); } }
F - 年 链接: https://codeforces.com/problemset/problem/1692/F 分析: 要让三个数相加末尾为 3,这只和数字的个位有关,我们存下数组中每个数的个位出现次数,然后三重循环枚举 0~10 之间的数字之和。就可以得到答案。
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 #include <bits/stdc++.h> using namespace std;#define int long long #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int a[15 ];void solve () { memset (a,0 ,sizeof a); int n; cin>>n; for (int i=1 ;i<=n;i++) { int m; cin>>m; a[m%10 ]++; } bool flag=false ; for (int i=0 ;i<=9 ;i++){ for (int j=0 ;j<=9 ;j++){ for (int k=0 ;k<=9 ;k++){ a[i]--;a[j]--;a[k]--; if ((i+j+k)%10 ==3 &&a[i]>=0 &&a[j]>=0 &&a[k]>=0 ) { flag=true ; break ; } a[i]++;a[j]++;a[k]++; } if (flag)break ; } if (flag)break ; } if (flag)cout<<"YES" <<endl; else cout<<"NO" <<endl; } signed main () { IOS int t; cin>>t; while (t--) { solve (); } }
G - 快 链接: https://codeforces.com/problemset/problem/1692/G 分析: 有多少段长度为 k 的区间满足题目中所说的性质。根据题目的公式可以发现,其实就是要求 ,所以就是求连续区间满足这个条件且满足区间长度为k+1 的区间个数。从第一个数字开始遍历即可。代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include <bits/stdc++.h> using namespace std;#define int long long #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); const int N=2e5 +5 ;int a[N];void solve () { int n,k; cin>>n>>k; for (int i=1 ;i<=n;i++)cin>>a[i]; int len=1 ; int ans=0 ; for (int i=2 ;i<=n;i++) { if (2 *a[i]>a[i-1 ]) { len++; }else len=1 ; if (len>k) ans++; } cout<<ans<<endl; } signed main () { IOS int t; cin>>t; while (t--) { solve (); } }
H - 乐 链接: https://atcoder.jp/contests/abc438/tasks/abc438_e 分析: 用 st[N][35] 来表示第 i 个水桶,传递了 次后这个桶在谁手里 把每个桶的初始状态都设为 st[i][0] 表示传递 0 次,桶还在自己手里。 这里用二进制来拼凑出总步数。比如 10 的二进制是 用 sum[N][35] 来表示第 i 个水桶,经过 次操作后,会积累多少水。 初始时 sum[i][0]=i 代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 #include <bits/stdc++.h> using namespace std;#define int long long #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); const int N=2e5 +5 ;int st[N][35 ];int sum[N][35 ];void solve () { int n,q; cin>>n>>q; for (int i=1 ;i<=n;i++) { cin>>st[i][0 ]; sum[i][0 ]=i; } for (int i=1 ;i<31 ;i++) { for (int j=1 ;j<=n;j++) { st[j][i]=st[st[j][i-1 ]][i-1 ]; sum[j][i]=sum[j][i-1 ]+sum[st[j][i-1 ]][i-1 ]; } } while (q--) { int t,b; cin>>t>>b; int ans=0 ; for (int i=0 ;i<31 ;i++) { if (t>>i&1 ){ ans+=sum[b][i]; b=st[b][i]; } } cout<<ans<<endl; } } signed main () { IOS int t=1 ; while (t--) { solve (); } }
欢迎关注我的微信公众号呀微信公众号文章链接