2019年湘潭大学程序设计竞赛(重现赛)ABCDEF
目录
//G Truthman or Fakeman//H Chat
A Who's better?
凭实力疯狂冗余的代码。。。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
const int maxn = 100010;
const int mod = 1e9+7;
int main()
{
int n1,n2,p1,p2,s1,s2;
while(cin>>n1>>p1>>s1)
{
cin>>n2>>p2>>s2;
if(n1 == n2)
{
if(p1 == p2)
{
if(s1 == s2)
puts("God");
else
{
if(s1 < s2)
cout<<1<<endl;
else
cout<<2<<endl;
}
}
else
{
if (p1 < p2)
cout << 1 << endl;
else
cout << 2 << endl;
}
}
else
{
if (n1 > n2)
cout << 1 << endl;
else
cout << 2 << endl;
}
}
return 0;
}
B Number
这题居然不卡时间。。我酸了
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
const int maxn = 100010;
const int mod = 1e9+7;
int main()
{
ios::sync_with_stdio(false);
int t;
ll num,n,cnt=0;
cin>>t;
while(t--)
{
cnt = 0;
cin>>num;
n = num;
while(num > 1)
{
if(num%10 == 0)
num /= 10;
else
num += 1;
cnt++;
}
cout<<cnt<<endl;
}
return 0;
}
C Math Problem
打表把前几千个写出来看看,找规律,简化公式
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <cmath>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
for(int ri = 0; ri< t;ri++)
{
ll le,r,x,y,sum = 0;
cin>>le>>r;
x = (le - 1)/192;
y = (r - 1)/192;
for(ll i = x + 1;i <= y;i++)
sum += (1 + 192 * i);
if(x*192 + 1 >= le)//注意这里要判断一下
sum += (x*192 + 1);
cout<<sum<<endl;
}
return 0;
}
D Stone
思维,想明白每一次加的是数组种的哪些数,举个例子写一写,除了最大的那个数字其他全部加起来就是最小体力值
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
const int maxn = 10010;
const int mod = 1e9+7;
ll a[maxn];
int t;
ll n;
int main()
{
scanf("%d",&t);
while(t--)
{
ll sum = 0,Max = -1;
memset(a,0,sizeof(a));
scanf("%lld",&n);
for(int i = 0;i < n;i++)
{
scanf("%lld",&a[i]);
sum += a[i];
if(a[i] > Max)
Max = a[i];
}
if(n == 1)
printf("0\n");
else
printf("%lld\n",sum-Max);
}
return 0;
}
E Watermelon
思维,把每个人可取的范围变化放到大范围L,R中
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 10;
ll a[maxn];
ll n,m;
int t;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&n,&m);
int maxdis = 1;
for(int i = 1;i <= n;i++)
{
a[i] = 0;
scanf("%lld",&a[i]);
if(a[i] > a[maxdis])//更简便的写法get
maxdis = i;
}
int tmp = 1,l = m,r = m;//初始L=R=m
while(1)
{
if(tmp > n)//注意易错!!写成tmp %= n,只在下标是0~n-1的时候合适!!!!!
tmp -= n;
if(tmp == maxdis)//对于肚量最大的人L和R都减去a[i]
{
if(r <= 0)//肚量最大的人吃西瓜时R<0,那么说明可以成功,得到答案为Yes
{
printf("YES\n");
break;
}
l -= a[tmp];//注意!!不要同一个变量全局定义一次,里面又定义一次!!易错!!尤其是这个t
r -= a[tmp];
}
else//对于非肚量最大的人L每次减一(至少吃一个),R每次减去能a[i](至多吃a[i]个)
{
if(l <= 0)//直到某个非肚量最大的人吃西瓜的时候如果L<0,得到答案为No
{
printf("NO\n");
break;
}
l -= 1;
r -= a[tmp];
}
tmp++;
}
}
return 0;
}
F Black & White
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include<list>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
typedef struct {
int c0 = 0,c1 = 0;
}node;
int t,n,m;
node a[maxn];
char s[maxn];
bool judge(int x,int y)
{
if(a[y].c0 - a[x].c0 <= m || a[y].c1 - a[x].c1 <= m)
return true;
return false;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m>>s+1;
for(int i = 1;i <= n;i++)
{
a[i] = a[i-1];
if(s[i] == '0')
a[i].c0++;
else
a[i].c1++;
}
int r = 0,ans=0,Max = -1;
for(int i = 0;i <= n;i++)//枚举左边起始点
{
r = i + 1;
while(r <= n && judge(i,r))
r++;
ans = r - i - 1;
Max = max(ans,Max);
}
cout<<Max<<endl;
}
return 0;
}