A.P6013 壓歲錢
退役了,真的退役了…三個月沒怎麼刷題,的第一題就把我弄自閉了,寫了半個小時,跑的還死慢。。不過我想只要是人都能看懂我這個代碼,大體上就是硬核模擬。
#include <stdio.h>
#include <iostream>
#include <queue>
#define int long long int
#define N 1000001
using namespace std;
struct node//並沒有什麼卵用的結構體,事實上在後面的讀入中只需要3個變量。
{
int id,val,to;//id:事件;val:得到或花掉的錢;to:僅事件3纔有的參數[持續到第幾天]
}a[N];
struct lst//這個結構體處理專門一系列的事件三
{
int duration,v;//duration代表封印持續到第幾天,v代表封印的錢
bool operator < (const lst &a)const
{
return a.duration<duration;//把持續時間從小到達排序
}
}tmp;
int n,s,ans,f;
priority_queue<lst> q;//優先隊列
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
register int i,j;
cin>>n;
for(i=1;i<=n;i++)//枚舉事件i
{
while(!q.empty())
{
if(q.top().duration==i)//判斷某個事件3的持續時間是否已經到了i
{
s=s+q.top().v;//把錢拿回來
q.pop();//踢掉
}
else break;//如果不是就不管
}
cin>>a[i].id;//輸入事件類型
if(a[i].id!=3)//如果不是3
{
cin>>a[i].val;
if(a[i].id==1)
{
s+=a[i].val;//直接賺錢即可
}
else//事件2
{
s-=a[i].val;//花錢
if(s<0)//如果沒有足夠的錢
{
s+=a[i].val;//再加回來
ans++;//不滿意的次數+1
}
}
}
else//事件3
{
cin>>a[i].val>>a[i].to;
s-=a[i].val;//減錢
tmp.duration=a[i].to;
tmp.v=a[i].val;
q.push(tmp);//塞進隊列
}
//cout<<s<<endl<<endl;
}
cout<<ans<<endl;
return 0;
}
B.P6014 [CSGRound3]鬥牛
太菜了,還是問了KillerXu纔會AC做法的。一開始寫的80分做法也是硬核模擬,因爲必定有張牌是不取的,所以枚舉這張牌即可。很簡單易懂,總體複雜度是。
#include <stdio.h>
#include <iostream>
#define int long long int
#define N 1000001
using namespace std;
int a[N],n,s,t,tmp;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
register int i,j,k;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
s+=a[i];
}
tmp=s;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
tmp=s;
if(i==j) continue;
tmp=tmp-a[i]-a[j];
if(tmp%10==0)
{
if((a[i]+a[j])%10==0) cout<<10<<endl;
else cout<<(a[i]+a[j])%10<<endl;
return 0;
}
}
}
cout<<0<<endl;
return 0;
}
然而肯定是過不了此題的,對於我們發現對於每一張牌的數都是的範圍內,所以就用桶的思想,枚舉可能的數即可。讀入,算法。
#include <stdio.h>
#include <iostream>
#define int long long int
#define N 11
using namespace std;
int a[N],n,s,t,tmp,f;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
register int i,j,k;
cin>>n;
for(i=1;i<=n;i++)
{
int wei;
cin>>wei;
a[wei]++;
s+=wei;
}
for(i=1;i<=10;i++)
{
if(a[i]>=2 && (s-i*2)%10==0)
{
t=(i*2)%10;
f=1;
}
}
for(i=1;i<=9;i++)
{
for(j=i+1;j<=10;j++)
{
if(a[i]>0 && a[j]>0 && (s-i-j)%10==0)
{
t=(i+j)%10;
if(t==0)
t=10;
f=1;
}
}
}
if(f==0) cout<<0<<endl;
else cout<<t<<endl;
return 0;
}
C.P6015 [CSGRound3]遊戲
自閉了,瞎幾把搞的,類似於尺取法,水了37分。有時間會獨立發佈AC解法。
#include <stdio.h>
#include <iostream>
#define N 1000001
#define int long long int
using namespace std;
int a[N],sum[N],n,m,G,s;
bool vis[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
register int i(0),j(0),k;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}cin>>m;
for(i=1;i<=n;i++)
{
if(sum[i]>m) G=i;
}
for(i=1;i<=m;i++)
{
for(j=1;j<=G+1;j++)
{
if(sum[j]>i) break;
}
for(k=j;k<=n;k++)
{
if(sum[k]-sum[j-1]>i) break;
}
if(sum[j-1]>sum[k-1]-sum[j-1])
{
vis[i]=1;
s++;
}
}
cout<<s<<endl;
for(i=1;i<=m;i++)
{
if(vis[i]) cout<<i<<' ';
}
cout<<endl;
return 0;
}
D.P6016 [CSGRound3]出遊
徹底自閉。這是一個數學問題,不會。不過3分是很好騙的:只需要把概率加起來再取模即可。
總結:
我菜死了,被全場吊打。