https://codeforces.com/contest/1102/problem/A
題意:給定一個數n,將1-n分成兩組,使得兩組數的差值最小,輸出最小差值。
思路:根據推理髮現,隨着n的增大,是有規律出現的,跟4的倍數有關係。
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
#define ll long long
int main()
{
ll n;
while(scanf("%lld",&n)!=EOF)
{
if(n%4==0)
cout<<0<<endl;
else if(n%4==1)
cout<<1<<endl;
else if(n%4==2)
cout<<1<<endl;
else if(n%4==3)
cout<<0<<endl;
}
return 0;
}
https://codeforces.com/contest/1102/problem/B
題意:給定n個數和k種顏色,要求這n個數字中相等的應該用不同的顏色塗色,並且這k種顏色都應該使用,所以只需要兩次排序,第一次將這n個數從此小到大排序,然後將這k個數分別取餘放上,之後再將這n個數,按照輸入的順序排序在輸出顏色的排布。
#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 400+100;
struct node
{
int x,pos,ks;
}pp[100005];
bool cmp2(node a,node b)
{
return a.x<b.x;
}
bool cmp1(node a,node b)
{
return a.pos<b.pos;
}
int main()
{
int n,k;
int vis[100005];
while(scanf("%d %d",&n,&k)!=EOF)
{
memset(vis,0,sizeof(vis));
int maxx=-inf;
for(int i=0;i<n;i++)
{
scanf("%d",&pp[i].x);
vis[pp[i].x]++;
maxx=max(maxx,pp[i].x);
pp[i].pos=i;
}
sort(pp,pp+n,cmp2);
/* for(int i=0;i<n;i++)
{
printf("%d ",pp[i].x);
}*/
if(n<k)
{
printf("NO\n");
return 0;
}
for(int i=1;i<=maxx;i++)
{
if(vis[i]>k)
{
printf("NO\n");
return 0;
}
}
int cur=1;
for(int i=0;i<n;i++)
{
// printf("%d ",cur);
if(cur%k==0)
pp[i].ks=k;
else
pp[i].ks=cur%k;
cur++;
}
sort(pp,pp+n,cmp1);
/* for(int i=0;i<n;i++)
{
printf("%d ",pp[i].pos);
}*/
printf("YES\n");
for(int i=0;i<n;i++)
{
if(i==0)
printf("%d",pp[i].ks);
else
printf(" %d",pp[i].ks);
}
printf("\n");
}
return 0;
}
https://codeforces.com/contest/1102/problem/C
題意:有n扇門,每扇門有一定的防禦值,其中一個人有x的攻擊力,另一個人有y的修復力,請問,x最多可以破壞幾扇門。
思路:如果說,x的破壞力大於y那麼他將破壞所有的門,但是如果,x<y 那麼尋找防禦值小於x的破壞,然後就能推出公式
#include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 400+100;
int main()
{
int n,x,y;
while(scanf("%d %d %d",&n,&x,&y)!=EOF)
{
int ans=0;
for(int i=0;i<n;i++)
{
int cur;
scanf("%d",&cur);
if(cur<=x)
ans++;
}
if(x>y)
printf("%d\n",n);
else
{
ans++;
ans/=2;
printf("%d\n",ans);
}
}
return 0;
}
https://codeforces.com/contest/1102/problem/D
題意:給定n個數由012三個數字組成,現在要求用最少的次數,使這三種數字的數量相等,而且必須滿足字典序最小。
思路:先統計一下012分別出現的個數,然後從前往後,從後往前分別掃一遍
#include<bits/stdc++.h>
#include<iostream>
#define ll long long
using namespace std;
int main()
{
int n;
string ch;
int vis[10];
while(scanf("%d",&n)!=EOF)
{
cin>>ch;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
vis[ch[i]-'0']++;
}
for(int i=0;i<n;i++)
{
if(vis[0]<n/3&&vis[ch[i]-'0']>n/3&&ch[i]!='0')vis[0]++,vis[ch[i]-'0']--,ch[i]='0';
if(vis[1]<n/3&&vis[ch[i]-'0']>n/3&&ch[i]=='2')vis[1]++,vis[2]--,ch[i]='1';
}
for(int i=n-1;i>=0;i--)
{
if(vis[2]<n/3&&vis[ch[i]-'0']>n/3&&ch[i]!='2')vis[2]++,vis[ch[i]-'0']--,ch[i]='2';
if(vis[1]<n/3&&vis[ch[i]-'0']>n/3&&ch[i]=='0')vis[1]++,vis[ch[i]-'0']--,ch[i]='1';
}
cout<<ch<<endl;
}
return 0;
}