继续上次的ACM(我承认我只是为了凑博客数)
Third
现在有n个杯子和t毫升茶水,现在满足以下条件:
- 每个杯子至少装一半的茶水
- 每个杯子必须装整数的茶水
- 所有茶水必须放到杯子中
- 要让所有客人满意(大杯茶的茶水多,小杯装的茶水少)
如果存在方案,任意输出一种;不存在则输出-1。
这道题目一看就“深藏不漏”。但是只要将题意理解了……何不是一道语文题。
#include<bits/stdc++.h>
using namespace std;
int n;
long long w;
int a[120]={};
int b[120]={};
int ans[120]={};
int minn=1000000000;
int main()
{
cin>>n>>w;//读入
intmaxw=0;
for(inti=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
maxw+=a[i];//maxw代表所有茶杯都装满水的所需最大茶水值
}
if(maxw<w)//如果连最大茶水值(将杯子都装满的情况下)还达不到它给的茶水量,那么后面的判断都不需要了,这一定是不可能得出方案的,直接输出-1
{
cout<<-1<<endl;
return0;
}
sort(a+1,a+n+1);
intnw=0;
for(inti=1;i<=n;i++)
{
ans[i]=(a[i]+1)/2;
nw+=ans[i];
}
if(nw>w)
{
cout<<-1<<endl;
return0;
}//如果满足条件的最小值还大于他给出的茶水之,那么也是不可能完成的
for(;nw<w;)
for(inti=n;i>=1;i--)
if(ans[i]<a[i]&&nw<w)
{
ans[i]++;
nw++;
}//因为要让客人满意,所以多余的茶水先逐一放入大杯
intf[120]={};
for(inti=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(f[j]==0&&a[j]==b[i])
{
b[i]=ans[j];
f[j]=1;
break;
}//按照他所给的顺序将答案放入b_i数组。F是为了避免数相同
for(int i=1;i<=n-1;i++)
cout<<b[i]<<' ';
cout<<b[n]<<endl;//输出答案。
return 0;
}
其实…..也不是很难的吧╮(╯-╰)╭(不存在的)
Fourth
Emm,没有AC的我无力解释,详见多重背包(听说资源分配也可)经典问题。
Fifth
有一个子序列,求子序列的个数(重复算作一个)
如此短小精炼的题目。。。
这是一道分明的递推题。如果不考虑重复的话dp[i]=dp[i-1]*2(含空集的情况)。考虑重复的问题,如果重复的话,那么要预先处理出与i之前最近的重复的数的位置j那么有dp[i]=dp[i-1]*2-dp[j-1]。(接受递推的磨练吧)
Sixth
两个人玩游戏
有一个序列,求最大分值,规则如下:
A给B一个序列,分值加上这个序列的所有数的和,如果此时给B的序列中只有一个数,那么B会扔掉这个序列,不然的话,B还给A。A将序列随意拆分给B其中一个,重复过程,直至两人手里的都没有序列(语文无能)
谈起这道题,我是很悲伤的。毕竟写了几个小时的高精度结果没AC,结果听到有人用long long给AC了,好无奈……
这道题实际上是很简单的,最小值其实就是每次让A去掉最小的那个数
这是我用高精度不断修改n+1次WA在第4个点的高精度。
#include<bits/stdc++.h>
using namespace std;
int a[10010]={};
int n;
int ans[10100]={};
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
if(a[n]==0||n==0)
{
cout<<0<<endl;
return 0;
}
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
intt=0;
intk=a[j];
if(i==j&&i!=n)
a[j]*=2;
for(;a[j]!=0;)
{
ans[++t]=ans[t]+a[j]%10;
a[j]/=10;
ans[t+1]=ans[t+1]+ans[t]/10;
ans[t]%=10;
}
a[j]=k;
}
int t=2002;
for(;ans[t]==0;)
t--;
for(int i=t;i>=1;i--)
cout<<ans[i];
cout<<endl;
return 0;
}
结果花了10minutes……
#include<bits/stdc++.h>
using namespace std;
int n;
long long a[300100]={};
long long ans=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
a[i]+=a[i-1];
for(int i=1;i<=n;i++)
{
ans=ans+(a[n]-a[i-1])+(a[i]-a[i-1]);
}
ans-=(a[n]-a[n-1]);
cout<<ans<<endl;
return 0;
}
Seventh
这是一道典型的DFS题…..无力分析