题解:
1.我们首先特判一下包装盒里面只有一个物品的情况,如果只装了一个物品,那我们就直接比较这两个物品的单价即可。
2.如果盒子里面装的不止是一键物品,那么我们就需要比较一下之间的单价了,如果价格相等,那么第一件物品肯定有优势(因为它可以一个一个卖),输出1 -1即可;如果第一件价格小于第二件价格,那么第二件物品就会“一无是处”,直接输出1 -1即可,如果第一件物品价格小于第二件物品价格,且单价要大于第二件物品,那么就可以输出1 b。(恰好为b件,肯定买第二件物品话算,因为单价低)
/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
int main()
{
ll a,b,c,t;
cin>>t;
while(t--){
cin>>a>>b>>c;
if(b==1){
if(a>b) cout<<"-1 1"<<endl;
else if(a<b) cout<<"1 -1"<<endl;
else cout<<"-1 -1"<<endl;
}
else{
if(a<c){
cout<<"1 ";
if(a*b<=c) cout<<-1<<endl;
else cout<<b<<endl;
}
else{
cout<<-1<<" ";
cout<<b<<endl;
}
}
}
return 0;
}
题解:
无论以什么样的删除方法删除,最终的结果是一样的,因为是他们每人走一步,所以判断积偶即可。
没删除一次让次数加一,删除方法用string类的erase即可
注意:因为本题范围小,所以使用erase,其实这个函数复杂度很高,不要乱用。
/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
string s;
int main()
{
int t;
cin>>t;
while(t--){
cin>>s;
int cnt=0;
bool flag=false;
while(true){
flag=false;
if(s.size()>1)
for(int i=0;i<s.size()-1;i++){
if(s[i]!=s[i+1]){
flag=true;
cnt++;
s.erase(i,2);
break;
}
}
if(!flag) break;
//cout<
//cout<
}
if(cnt%2==0) cout<<"NET"<<endl;
else cout<<"DA"<<endl;
}
return 0;
}
题解:这个题目暴力模拟的话肯定会超时啊。
找一下规律,以免放置他重复的进行某些算过的数字,看代码应该可以懂。
就只有一个if语句。
/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
string s;
int main()
{
int t;
cin>>t;
while(t--){
cin>>s;
ll ans=0,cnt=0,x=0,last=0;
for(int i=0;i<s.size();i++){
ans++;
if(s[i]=='+') cnt++;
else cnt--;
if(cnt<0){
cnt=0;
ll t=ans;
ans+=ans-last;
last=t;
}
}
cout<<ans<<endl;
}
return 0;
}
题解:
首先我们可以得知,反转偶数段的效果就是让这一段的奇偶反转,这样的话,问题就得到了简化。
我们用一个数组储存相邻之间的积偶差值(奇数-偶数)
有两种情况(数字为下标)
第一种: 1-2 3-4 5-6 这些数字之间调换
第二种: 2-3 4-5 6-7 这些数字之间进行调换
所以我们拿出b,c两个数组来储存着两种差值情况。
然后我们找到最大连续区间和(b,c)这两个数组。
说明一下这个最大值,为什么直接加上这个最大值,因为这个值代表的是反转某段区间后,总值可以加多少
找一个最大值,加上偶区间的数字大小即可。
时间复杂度O(n)
/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include
const int maxn = 2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
ll a[maxn];
ll b[maxn];
ll c[maxn];
ll maxsum(ll a[],int n)
{
ll ans=0;
for(int i=0;i<n;i++)
{
if(a[i-1]>0)a[i]+=a[i-1];
else a[i]+=0;
if(a[i]>ans) ans=a[i];
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--){
ll ans=0;
int n;
scanf("%d",&n);
for(int i=0;i<n+5;i++){
a[i]=b[i]=c[i]=0;
}
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
if(i%2==0)ans+=a[i];
}
int cnt=0;
for(int i=0;i<n;i+=2){
b[cnt++]=a[i+1]-a[i];
}
cnt=0;
for(int i=2;i<n;i+=2){
c[cnt++]=a[i-1]-a[i];
//cout<
}
// for(int i=0;i
// cout<
// for(int i=0;i
// cout<
ll imax=maxsum(b,n/2+2);
imax=max(imax,maxsum(c,n/2+2));
//cout<
printf("%lld\n",ans+imax);
}
return 0;
}