https://vjudge.net/contest/374572
A CodeForces 903A Hungry Student Problem
水
#include
using namespace std;
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));
typedef long long ll;
const int mod = 998244353;
const int maxn = 2e5;
using namespace std;
/***********************defination************************/
int main()
{
int round;
cin>>round;
while(round--)
{
int tar;
cin>>tar;
bool flag = false;;
int a = tar / 7;
while(a >= 0)
{
if((tar - a*7)%3 == 0)
{
flag = true;
break;
}
else a--;
}
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
B - The Modcrab CodeForces - 903B
水
#include //poj,hdu can't use it
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));
typedef long long ll;
const int mod = 998244353;
const int maxn = 2e5;
using namespace std;
/***********************defination************************/
int main()
{
int h1,a1,c1;
int h2,a2;
int ans = 0;
cin>>h1>>a1>>c1>>h2>>a2;
queue<string>q;
while(1)
{
ans++;
if(a1 >= h2)
{
q.push("STRIKE");
break;
}
else if(h1 <= a2)
{
q.push("HEAL");
h1 = h1 - a2 + c1;
}
else{
q.push("STRIKE");
h2-=a1;
h1-=a2;
}
}
cout<<ans<<endl;
while(!q.empty())
{
string temp = q.front();
q.pop();
cout<<temp<<endl;
}
return 0;
}
C - Boxes Packing CodeForces - 903C
假想箱子已经排序过了,那么每一个相同尺寸的箱子形成造成多余的另外一组,比如 1 2 3 3,只能分成123和3;并且不同尺寸的多余箱子可以凑成一组,比如说1 2 2 3 3可以分成123和23。因此只用看每一个出现数字的最大次数。
//#include//poj,hdu can't use it
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
/************************head file************************/
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));
typedef long long ll;
const int mod = 998244353;
const int maxn = 1e9+10;
using namespace std;
/***********************defination************************/
map<int,int> q;
int main()
{
int n;
cin>>n;
int Max = 1;
for(int i = 0;i < n;i++)
{
int temp;
scanf("%d",&temp);
q[temp]++;
Max = max(Max,q[temp]);
}
cout<<Max<<endl;
return 0;
}
D - Almost Difference CodeForces - 903D
不难,但是坑人。
给了一个堆数字,遍历到第x个数字的时候,令第x个数字和前面所有数字相减。设与第y个数字相减,如果x - y的绝对值大于一则值等于x-y,小于等于一则值等于零。求这些值的总和。
不难发现,假如说1 2 3 4 6 8,到六的时候值为(6-1)+(6-2)…(6-4)=46-(1+2+3+4);八的时候为(58-1+2+3+4+6),故用一个sum记录前缀和,ans记录当前值即可,注意去掉相邻的两个数带来的影响即可。
恶心人的地方在于ans会爆ll,一般来说爆ll应该取模的…如果不知道用Long double的话可以用大数(这时候学多一个python的重要性就出来了)
#include
using namespace std;
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));
typedef long long ll;
const int mod = 998244353;
const int maxn = 1e9+10;
using namespace std;
/***********************defination************************/
map<ll,ll> m;
int main()
{
m.clear();
ll n;
cin>>n;
long double ans = 0,sum = 0;
for (ll i = 1; i <= n; ++i)
{
int t;
cin >> t;
sum += t;
ans += i*t - sum;
ans -= m[t - 1];
ans += m[t + 1];
m[t]++;
}
cout << setiosflags(ios::fixed) << setprecision(0) << ans << endl;
return 0;
}
E题字符串模拟
F题状压DP
G题网络流
代补