https://www.nowcoder.com/test/10611931/summary
思路:水题不解释,代码没有化简。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m;
int main()
{
cin>>n>>m;
cout<<n/(2*m)*m*m<<endl;
return 0;
}
思路:水题,排完序后从大到小依次选取。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int a[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
ll sum1=0,sum2=0;
for(int i=n-1,j=1;i>=0;i--,j++)
{
if(j&1)
sum1+=a[i];
else
sum2+=a[i];
}
printf("%lld\n",sum1-sum2);
return 0;
}
思路:二分第一天吃的巧克力块数。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int l=1,r=m,mid;
while(l<=r)
{
mid=(l+r)>>1;
int sum=mid,tmp=mid;
for(int i=1;i<n&&sum<=m;i++)
{
tmp=(tmp+1)>>1;
sum+=tmp;
}
if(sum>m)
r=mid-1;
else
l=mid+1;
}
printf("%d\n",r);
return 0;
}
思路: ,类似于背包问题,设 表示总长度恰好为 的歌单有多少种组成方法,那么对于一首长度为 的歌,有: 。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int dp[1005];
int main()
{
int k,a,b,x,y;
scanf("%d%d%d%d%d",&k,&a,&x,&b,&y);
dp[0]=1;
for(int i=0;i<x;i++)
for(int j=k;j>=a;j--)
dp[j]=(dp[j]+dp[j-a])%mod;
for(int i=0;i<y;i++)
for(int j=k;j>=b;j--)
dp[j]=(dp[j]+dp[j-b])%mod;
printf("%d\n",dp[k]);
return 0;
}
思路:这题出错了。改题面改的相当失败,
收益造成了贪心的错误,网上大部分题解都是错误的,即使正确也很难在这个数据范围下快速给出答案。不过还是给出
代码。顺便给出一个
数据:
显然最优解是
,然而下面代码给出的答案是错误的。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
int cnt[105];
struct node
{
int x,y;
node(){}
node(int xx,int yy):x(xx),y(yy){}
bool operator <(const node &a)const
{
return x>a.x;
}
}a[maxn],b[maxn];
int main()
{
int n,m,x,y;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
a[i]=node(x,y);
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
b[i]=node(x,y);
}
sort(a,a+n);
sort(b,b+m);
int ct=0;
ll ans=0;
for(int i=0,j=0;i<m;i++)
{
while(j<n&&a[j].x>=b[i].x)
++cnt[a[j].y],++j;
for(int k=b[i].y;k<=100;k++)
{
if(cnt[k])
{
++ct,ans+=200*b[i].x+3*b[i].y;
--cnt[k];
break;
}
}
}
printf("%d %lld\n",ct,ans);
return 0;
}
思路:模拟题,分两次考虑,第一次只考虑斜率为
的情况,第二次只考虑斜率为
的情况。那么只要某个点的颜色和最终的颜色不一样,就一定要沿着这条线画下去,模拟就完事了。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int n,m,ans;
char a[55][55],b[55][55];
void modify1(int x,int y)
{
bool flag=0;
while(x>=0&&x<n&&y>=0&&y<m)
{
if((a[x][y]=='B'||a[x][y]=='G')&&b[x][y]=='X')
{
flag=1;
b[x][y]='B';
x++,y--;
}
else
break;
}
ans+=flag;
}
void modify2(int x,int y)
{
bool flag=0;
while(x>=0&&x<n&&y>=0&&y<m)
{
if(a[x][y]=='B'||a[x][y]=='X'||a[x][y]==b[x][y])
break;
flag=1;
if(b[x][y]=='X')
b[x][y]='Y';
else if(b[x][y]=='B')
b[x][y]='G';
x++,y++;
}
ans+=flag;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",a[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
b[i][j]='X';
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
modify1(i,j);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
modify2(i,j);
printf("%d\n",ans);
return 0;
}