第一题:
(没有找到下面的截图了)
这一题二了。一看到硬币简直是条件反射想到那个经典的背包问题。给你1块钱、3块钱、5块钱的硬币,怎么找零最小。所以写了下面的代码一。但其实根本不必要,直接贪心就可以了。因为这题里面的1,4,16,64都是倍数关系Orz,所以就有了代码二(不过当时没有想出来)。
代码一:
#include <iostream>
using namespace std;
int coin[4] = {1,4,16,64};
int func(int num)
{
int *d = new int[num + 1];
d[0] = 0;
for (int i = 1; i <= num; ++i)
{
d[i] = i;
for (int j=0;j<4;j++)
if (coin[j] <= i && d[i - coin[j]] + 1 < d[i])
d[i] = d[i - coin[j]] + 1;
}
return d[num];
}
int main()
{
int n;
cin >> n;
cout << func(1024-n) << endl;
return 0;
}
代码二:
#include <stdio.h>
int main(){
int n,num;
scanf("%d",&n);
n=1024-n;
num=n/64;
n%=64;
num+=n/16;
n%=16;
num+=n/4;
n%=4;
num+=n;
printf("%d",num);
return 0;
}
第二题:
题目:(最后一段读了超久,最后发现真的只是个结尾)
暴力了。本来想的蛮复杂,要用判断,还要记录上一个状态,后来想,直接判断好像也可以哦,这样应该算O(n)吧~(´▽`)
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
int num;
scanf("%d",&num);
for(int i=0;i<num;i++){
cin>>str;
string now="";
now.append(1,str[0]);
now.append(1,str[1]);
int j = 1;
for(int n=2;n<str.length();n++){
if(str[n]==now[j] && now[j]==now[j-1])
continue;
if(str[n]==now[j] && now[j-1]==now[j-2])
continue;
now.append(1,str[n]);
j++;
}
cout<<now<<endl;
}
return 0;
}
PS:本来是用python写的,结果没有解决那个input定义问题。就被迫换C了。
第三题:(找不到图片,待补充)
#include<iostream>
#include<algorithm>
using namespace std;
int const maxn=1e5+10;
#define echo(i) ((i)==0?n:(i)==n+1?1:(i))
struct node
{
int i,v;
}co[maxn];
int book[maxn];
int ori[maxn];
bool operator<(node a,node b)
{
return a.v<b.v;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
cin>>n;
memset(book,0,sizeof(book));
for(int i=1;i<=n;i++)
{
scanf("%d",&co[i].v);
co[i].i=i;
ori[i]=co[i].v;
}
sort(co+1,co+n+1);
int idx;
ori[0]=0;
ori[n+1]=0;
long long sum=0;
int l,r;
for(int i=1;i<=n;i++)
{
idx=co[i].i;
l=echo(idx-1);
r=echo(idx+1);
book[idx]=1;
if(ori[idx]>ori[l])
{
book[idx]=max(book[idx],book[l]+1);
}
if(ori[idx]>ori[r])
{
book[idx]=max(book[idx],book[r]+1);
}
sum+=book[idx];
}
cout<<sum<<endl;
}
}
第四题:(找不到图片,待补充)
本题尽过90%的cases。如果大神AC了,劳烦告知~差一点真的很难受QAQ
#include<cstring>
#include<algorithm>
#include<stdio.h>
#include<iostream>
using namespace std;
int const maxn=1e5+10;
typedef long long ll;
#define int ll
ll co[maxn];
int n,k;
int check(double mid)
{
int cnt=0;
for(int i=0;i<n;i++)
{
cnt+=co[i]/mid;
if(cnt>=k)
return 1;
}
return 0;
}
signed main()
{
cin>>n>>k;
int maxv=0;
if(n==1){
}
for(int i=0;i<n;i++)
{
scanf("%lld",co+i);
maxv=max(co[i],maxv);
}
double l,r;
double mid;
l=0;
r=maxv;
while(r-l>1e-8)
{
mid=(l+r)/2;
if(check(mid))
{
l=mid;
}
else
r=mid;
}
printf("%.2f\n",l);
}