看到F题没有思路的我螺旋爆炸弱。
A
模拟题。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){
int n,k;
scanf("%d%d",&n,&k);
while(k > 0 && n) {
if(n % 10) {
n--; k--;
} else {
n /= 10; k--;
}
}
printf("%d\n",n);
return 0;
}
B
模拟题。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
char bbf[10];
int main(){
cin>>n;
string buf; cin>>buf;
int len = buf.size();
map< string , int >mmp;
for(int i = 0; i < len - 1; i++) {
string bb = "";
bb = bb + buf[i];
bb = bb + buf[i+1];
if(mmp.find(bb) != mmp.end()) {
mmp[bb]++;
} else {
mmp[bb] = 1;
}
}
string x = (mmp.begin())->first;
for(auto i = mmp.begin(); i != mmp.end(); i++) {
if(i->second > mmp[x]) {
x = i->first;
}
}
cout<<x<<endl;
return 0;
}
C
排序。模拟题。
弄清楚题意。例如1 3 3 3,不可能存在正好有两个元素小于它的x,因为这里要么就是0个,要么就是1个,要么就是4个。
k = 0要特判,因为对于1 3 3 3这样的输入,k = 0时不可能输出1(因为这样就是1个元素了),但是对于「任意大于1的数 其他大于1的数 其他大于1的数 …」这样都输入就可以输出1,因为正好就是只有0个元素小于等于1。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,k;
int a[200005];
int res[200005]; int resp;
int main() {
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int l = 0, r = 0;
sort(a,a+n);
if(k == 0) {
if(a[0] == 1) {
printf("-1\n");
goto leave;
} else {
printf("1\n");
goto leave;
}
}
while(r < n) {
while(r < n && a[r] == a[l]) {
r++;
}
res[resp] = res[resp-1] + (r - l);
resp++;
l = r;
}
for(int i = 0; i < resp; i++) {
if(res[i] == k) {
printf("%d\n",a[k-1]);
goto leave;
}
}
printf("-1\n");
leave:;
return 0;
}
D
对于题目给出的任意一个数
都可以设为
。整个过程中,
越来越小,
越来越大。按这样的规则进行排序。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
int n;
ll a[105];
bool cmp(ll a, ll b) {
int cnt2a = 0, cnt2b = 0, cnt3a = 0, cnt3b = 0;
ll a2 = a, b2 = b, a3 = a, b3 = b;
while(a2&&a2%2 == 0) {
a2 >>= 1, cnt2a++;
}
while(b2&&b2%2 == 0) {
b2 >>= 1, cnt2b++;
}
while(a3&&a3%3 == 0) {
a3 /= 3, cnt3a++;
}
while(b3&&b3%3 == 0) {
b3 /= 3, cnt3b++;
}
return
(cnt3a > cnt3b)
|| (cnt3a == cnt3b && cnt2a < cnt2b)
;
}
int main(){
scanf("%d",&n);
for(int i = 0; i < n; i ++) {
scanf("%lld",&a[i]);
}
sort(a,a+n,cmp);
for(int i = 0; i < n; i++) {
printf("%lld%c",a[i],i==n-1?'\n':' ');
}
return 0;
}
E
注意到一个cycle中的所有点的度都为2。枚举所有度为2的点,做bfs。假如bfs中遇到度不为2的点,则这个联通分量不是一个cycle。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
int n,m;
struct e { int to, next; } es[400005]; int ep = 1;
int head[200005];
int deg[200005];
bool vis[200005];
void adde(int from, int to) {
es[ep].to = to;
es[ep].next = head[from];
head[from] = ep;
ep++;
}
bool bfs(int stp) {
queue< int >ws;
ws.push(stp);
bool flag = true;
while(!ws.empty()) {
int pivot = ws.front(); ws.pop();
if(vis[pivot])continue;
if(deg[pivot]!=2){
flag = false;
}
for(int x = head[pivot]; x != 0; x = es[x].next) {
ws.push(es[x].to);
}
vis[pivot] = true;
}
return flag;
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 0;i < m;i++) {
int a,b;scanf("%d%d",&a,&b);
adde(a,b);
adde(b,a);
deg[a]++;
deg[b]++;
}
int res = 0;
for(int i = 0; i < n; i++) {
if(deg[i] == 2 && !vis[i]) {
if(bfs(i)) {
res++;
}
}
}
printf("%d\n",res);
return 0;
}