A. Trip For Meal
给你3个点,和3点之间的距离,让你从一个点出发,走n-1次,求最短距离。
POINT:
数据很小,直接模拟,找规律做也很简单。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int n,r,o,e;
int ans=0;
int f(int x){
if(x==1){
if(r>o){
ans+=o;
return 3;
}else{
ans+=r;
return 2;
}
}else if(x==2){
if(r>e) {
ans+=e;
return 3;
}
else {
ans+=r;
return 1;
}
}else{
if(e>o) {
ans+=o;
return 1;
}
else{
ans+=e;
return 2;
}
}
}
int main()
{
cin>>n>>r>>o>>e;
int cnt=0;
cnt++;
int a=1;
while(cnt<n){
a=f(a);
cnt++;
}
printf("%d\n",ans);
}
B. Divisiblity of Differences
题意:
给你n,k,m,给你n个数,让你求有没有一个集合,集合内的数两两相减在对m求余等于0,判断这种集合元素有没有k个,有输出k个,任意k个,从小到大。
POINT:
相减对m求余等于0 等价于。 对m求余相减=0。
所以对每个数求余,记录余数,余数个数大于等于k个就行。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include<algorithm>
using namespace std;
const int maxn =101000;
int a[maxn];
int b[maxn];
int num[maxn];
int main()
{
int n,k,m;
scanf("%d %d %d",&n,&k,&m);
int qi=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i]%m;
num[b[i]]++;
if(num[b[i]]>=k){
qi=i;
}
}
if(qi){
int ans[maxn];
int cnt=0;
int d=b[qi];
printf("Yes\n");
for(int i=1;i<=n;i++){
if(a[i]%m==d){
ans[++cnt]=a[i];
if(cnt==k) break;
}
}
sort(ans+1,ans+1+cnt);
for(int i=1;i<=k;i++){
if(i-1) printf(" ");
printf("%d",ans[i]);
}
}
else{
printf("No\n");
}
}
C. Classroom Watch:
给你一个n,让你求有几个这样的数并输出:
a+a在每一位上的数==n。
POINT:
n<=1e9,也就是说,每一位上的数加起来最多也就81。那么范围肯定是[n-81,n]。为了方便,直接100.
注意n-100于0的比较。。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
const int maxn =101000;
int a[maxn];
void doit(int &ans,int x){
while(x){
ans+=x%10;
x/=10;
}
}
int main()
{
int cnt=100;
int n;
cin>>n;
int m=max(0,n-100);
int aa[1111];
int num=0;
for(int i=m;i<=n;i++){
int ans=i;
doit(ans,i);
if(ans==n){
aa[++num]=i;
}
}
printf("%d\n",num);
for(int i=1;i<=num;i++){
if(i-1) printf(" ");
printf("%d",aa[i]);
}
if(num)
printf("\n");
}
D. Sorting the Coins
题目很长,也很细节,自己看吧。
POINT:
思路是找到最后一个O,在数一数前面有几个X,X+1就是答案。
稍微想想就知道怎么实现了。可以不用树状数组,直接o(1)的效率求出x的数量。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
const int maxn =303000;
int a[maxn];
int sum[maxn];
int flag[maxn];
int n;
int lowbit(int x){
return x&-x;
}
void change(int x){
flag[x]=1;
for(int i=x;i<=n+2;i+=lowbit(i)){
sum[i]++;
}
}
int query(int x){
int ans=0;
for(int i=x;i>=1;i-=lowbit(i)) ans+=sum[i];
return ans;
}
int main()
{
scanf("%d",&n);
int last=n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int ans=0;
printf("1");
for(int i=1;i<=n;i++){
change(a[i]);
if(a[i]==last){
while(flag[last]==1){
last--;
}
}
ans=query(last);
printf(" %d",ans+1);
}
}