地址:https://codeforces.com/contest/1373
思路:只卖一个物品时比较a和c的大小即可得到res1,再买b个物品时比较a*b和c的大小即可得到res2
Code:
#include<iostream>
using namespace std;
typedef long long LL;
int main()
{
ios::sync_with_stdio(false);
int T;
LL a,b,c,res1,res2;
cin>>T;
while(T--){
cin>>a>>b>>c;
res1=res2=-1;
if(a<c) res1=1;
if(c<a*b) res2=b;
cout<<res1<<" "<<res2<<endl;
}
return 0;
}
思路:显然无论怎么选择的结果都是不变的,只需要判断0和1中个数较小的那个的奇偶即可
Code:
#include<iostream>
using namespace std;
typedef long long LL;
int main()
{
ios::sync_with_stdio(false);
int T;
string str,res;
int n,a;
cin>>T;
while(T--){
res="NET";
cin>>str;
n=str.length(); a=0;
for(int i=0;i<n;++i)
if(str[i]=='0') ++a;
a=min(a,n-a);
if(a%2) res="DA";
cout<<res<<endl;
}
return 0;
}
思路:通过伪代码可以判断出其运行思路,然后将其改成一次循环即可。。
Code:
#include<iostream>
using namespace std;
typedef long long LL;
int main()
{
ios::sync_with_stdio(false);
int n,T;
string str;
cin>>T;
while(T--){
cin>>str;
n=str.length();
LL res=n,sum=0;
for(int i=0;i<n;++i)
{
if(str[i]=='+') ++sum;
else --sum;
if(sum<0){
res+=i+1;
++sum;
}
}
cout<<res<<endl;
}
return 0;
}
D. Maximum Sum on Even Positions
思路:对于转换序列即将原来在偶数位置的元素用它相邻(前一个或后一个)的奇数位置的元素互换,而互换后加的值就是它们的差值,因此就转化为求差值数组的最大子段和
Code:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MAX_N=2e5+5;
int n,T;
LL a[MAX_N],d1[MAX_N],d2[MAX_N];
LL Find(LL d[],int len);
int main()
{
ios::sync_with_stdio(false);
cin>>T;
while(T--){
cin>>n;
for(int i=0;i<n;++i)
cin>>a[i];
LL res=a[0];
int l1=0,l2=0;
for(int i=1;i<n;++i)
{
if(i&1){
d1[l1++]=a[i]-a[i-1];
}else{
res+=a[i];
d2[l2++]=a[i-1]-a[i];
}
}
res+=max(Find(d1,l1),Find(d2,l2));
cout<<res<<endl;
}
return 0;
}
LL Find(LL d[],int len)
{
LL res=0,Min=0,Sum=0;
for(int i=0;i<len;++i)
{
Sum+=d[i];
Min=min(Min,Sum);
res=max(res,Sum-Min);
}
return res;
}