Travelling Salesman Problem
了解了向上取整的符号⌈ ⌉以及表示方式;
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long x,y,k;
long long t;
long long ans;
cin>>t;
for(long long i=1;i<=t;i++){
cin>>x>>y>>k;
ans=max((y+k-1)/k*2,(x+k-1)/k*2-1);
cout<<ans<<endl;
}
return 0;
}
话题焦点人物
最开始的时候把数组开太大导致devc++一直报未编译。。。后来又把某个m和N写错了。。。。。。
#include <bits/stdc++.h>
using namespace std;
const long long N=102;
long long b[N][N]={0},s[N]={0};
int main()
{
long long m;
long long n,a;
long long p;
cin>>n;
for(long long i=1;i<=n;i++){
cin>>a>>m;
for(long long j=1;j<=m;j++){
cin>>p;
b[p][a]++;
s[p]++;
}
}
long long max=-99,q=0;
for(long long i=1;i<N;i++){
if(s[i]>max){
max=s[i];
q=i;
}
}
cout<<q<<endl;
for(long long i=1;i<N;i++){
if(b[q][i]!=0) cout<<i<<" ";
}
return 0;
}
Master of GCD
- 先用差分和前缀和把每一项需要×2和×3的次数统计出来
- 在最小的×2次数下乘出来的积和在最小的×3次数下乘出来的积的积就是它的最大公因数(因为初始值都是1)/好像在说绕口令QAQ
#include <bits/stdc++.h>
using namespace std;
const long long N=100020;
long long two[N]={},three[N]={};
int main()
{
ios::sync_with_stdio(0);
long long t;
cin>>t;
while(t--)
{
long long n,m;
cin>>n>>m;
for(long long i=1;i<=m;i++)
{
long long l,r,x;
cin>>l>>r>>x;
if(x==2){
two[l]++;
two[r+1]--;
}
else{
three[l]++;
three[r+1]--;
}
}
long long min2=9999999,min3=9999999;
for(long long i=1;i<=n;i++){
two[i]=two[i-1]+two[i];
if(two[i]<min2) min2=two[i];
three[i]=three[i-1]+three[i];
if(three[i]<min3) min3=three[i];
}
long long q=998244353;
long long ans=1;
for(long long i=1;i<=min2;i++){
ans=ans*2%q;
}
for(long long i=1;i<=min3;i++){
ans=ans*3%q;
}
cout<<ans<<"\n";
for(long long i=1;i<=n+1;i++){
two[i]=0,three[i]=0;
}
}
return 0;
}
一些碎碎念:
- 一定要加ios::sync_with_stdio(0);不然似乎会超时QAQ
- 最后把数组two和three初始化的时候要记得是从1到n+1,因为差分还会往后用到n+1QAQ