题目链接:点击打开链接
比赛当时只做出了A题,然后其他题都没想出来,结果,第二天一看榜,0分……
只是因为,我把A题中的一个条件写成了这个样子 a==b==c 感觉自己好萌。= =
补了ABCD 另外两题过的人数太少,我觉得对我来说没有必要补……,先把2000人过的题目做会再说把。
A题,画个图,就出来了。分情况 讨论一下,很水。
#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
int main(){
int n,a,b,c;
scanf("%d%d%d%d",&n,&a,&b,&c);
if(a==b&&a==c) printf("%d\n",(n-1)*a);
else{
if(a<=b&&a<=c){
printf("%d\n",(n-1)*a);
}else if(b<=c&&b<=a){
printf("%d\n",(n-1)*b);
}else if(c<=a&&c<=a){
if(n==1){
printf("0\n");
}else if(n==2){
printf("%d\n",min(a,b));
}else if(n>=3){
printf("%d\n",min(a,b)+(n-2)*c);
}
}
}
return 0;
}
B题,如果x-y 可以整除m 那么 x mod m==y mod m 根据这个条件,那么我们对输入的每个数据进行取余数后分类,如果某一类的个数大于等于k个,按照从小到大顺序输出k个即可。
#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
int a[maxn];
vector<int>G[maxn];
int main(){
int n,k,m;
scanf("%d%d%d",&n,&k,&m);
for(int i=0;i<n;i++){
int x;
scanf("%d",&x);
G[x%m].push_back(x);
}
/*
for(int i=0;i<m;i++){
printf("%d:%d\n",i,G[i].size());
}
// */
bool flag=false;
int ans;
for(int i=0;i<m;i++){
if((G[i].size())>=k){
flag=true;
ans=i;
break;
}
}
// */
if(!flag) printf("No\n");
else{
printf("Yes\n");
sort(G[ans].begin(),G[ans].end());
int cnt=0;
for(auto it=G[ans].begin();it!=G[ans].end();it++){
if(cnt==k) return 0;
if(it!=G[ans].begin()) printf(" %d",*it);
else printf("%d",*it);cnt++;
}
}
return 0;
}
C题 ,智商题, n=x+sum of digits(x)。又因为,n<=1e9 那么 sum of digits(n)<= 81 所以只要暴力遍历即可。 从max(1,n-81)----n 遍历一边就行……
/*2017年10月18日15点14分
AC*/
#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int inf=1e9;
vector<int> ans;
int main(){
int n;
scanf("%d",&n);
for(int i=max(1,n-81);i<=n;i++){
int sum=0;
int num=i;
while(num){
sum+=num%10;
num/=10;
}
if((n-sum)==i) ans.push_back(i);
}
if(ans.size()==0) printf("0\n");
else {
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++){
printf("%d\n",ans[i]);
}
}
return 0;
}
D题,题目看了好久看不明白,最后看着样例大概懂了,初始状态n个O,然后给你 n个数字,每次给你一个a[i],把第I位置为X,然后要把X按照题目中描述的那样移动,问每给一个a[i]需要移动多少次,其实就是统计每次最后一个O的位置前面有多少个X, 这题T了两次,优化了一下就过了。
/*2017年10月18日16点04分
AC
优化了两次,
T1:TLE 10
T2:TLE 12
AC*/
#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=3e5+10;
int a[maxn];
bool f[maxn];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
memset(f,false,sizeof(f));
int cnt=0;
int loc=n;
for(int i=0;i<=n;i++){
if(i==0) printf("1 ");
else{
int x=a[i-1];
f[x]=1;
cnt++;
if(f[loc]==1){
for(int j=loc;j>=1;j--){
if(f[j]==0){
loc=j;
break;
}
}
}
//printf("loc=%d\n",loc);
if(i==n) loc=0;
int cntn=n-loc;
printf("%d ",cnt-cntn+1);
}
}
return 0;
}